反射(2019年10月28日)

目前创建对象的三种方式:1.通过构造方法,用关键字new来创建对象 2.用clone来浅拷贝一个对象 3.利用反射机制,反射一个对象

反射方式创建类;

1.利用已经存在的对象来反射新的对象

1 Student s = new Student();

2 Class sClazz = s.getClass();  

2.利用已知类名来创建对象

1 Class clazz = Student.class; 

3.利用准确的类名来创建对象

1 Class clazz = Class.forName("com.bli.zyx.Student");

2 Student s=(Student)clazz.newInstance();

//newInstance会去找无参的构造方法执行,创建对象

如果对象中没有无参的构造方法,那么我们需要创建一个构造器来创建有参的构造方法

1                Constructor <Student> c=clazz.getConstructor(String.class,String.class);//利用构造器,后面的参数是构造函数中的形式参数类型

通过构造器的方式可以匹配不同的参数列表的构造方法
      Constructor<Student> c = clazz.getConstructor(String.class,int.class);
      Student s1 = c.newInstance("asdfa",123);
      s1.eat();

  Constructor [] consList = clazz.getConstructors();//构造器数组,可以把所有的构造器都取到 

取到属性:

 获取共有的属性
 Field f = clazz.getField("room");
f.set(s1,
"room222");//设置属性

 获取私有的属性

            Field f1 = clazz.getDeclaredField("stuNo");
        System.out.println(f1.getName());
        f1.setAccessible(true);// 给权限来修改私有的属性值
        f1.set(s1, "101");

 获取属性数组,并遍历

                Field [] flist = clazz.getDeclaredFields();
        for(Field f:flist){
            System.out.println(f.getName());
        }

获取方法:

  获取公开的方法:

        Method  studyM1 = clazz.getMethod("study", String.class);
        studyM1.invoke(s1, "hello");

  获取私有的方法:

        Method m3 = clazz.getDeclaredMethod("study", String.class);
        m3.setAccessible(true);// 给权限
        m3.invoke(s1, "abc");

  获取方法的数组,并遍历

        Method [] mList = clazz.getDeclaredMethods();
        for(Method m : mList){
            System.out.println(m);
        }

  

原文地址:https://www.cnblogs.com/Starlets/p/11767036.html