1.反射是什么?
反射就是“把java类中的各种成分映射成java中的各种类”;
2.反射能做什么?
(1)做框架用;
(2)让代码通用性更好;
3.反射的优点和缺点:
缺点:影响程序的性能;
优点:可以实现动态的创建对象和编译。
4.如何反射?
(1)获取类的字节码的3种方式:
A.利用字节码类Class:Class clazz = Class.forName(“类的完整名称”);
B.利用类变量class:Class clazz = 类名.class;
C.利用对象的方法:Class clazz = 对象.getClass();
*对Class的理解:
描述人的属性和行为用Person类,描述类的属性和行为用Class;
人的具体对象有张三、李四等,Class的具体对象就是被JVM加载进内存(硬盘上的静态.class文件不是)的String.class,int.class,Student.class这样的字节码文件,JVM虚拟机把字节码文件加载进内存的动作就是创建Class具体对象的过程,字节码文件在内存中只有一份,并且是由字节码代表的类的对象共享的,所以它的引用是由字节码代表的类的静态成员变量,即类变量class维护(我自己的猜测:String.class就是我们在代码里写的String,只是使用的时候省略了后面的.class而已);
*我们可以把类和类的字节码认为是同一个东西,只是叫法不一样,比如一个人在家里被爸爸妈妈叫做“阿亮”,但是在外边被哥们叫做“亮哥”,但它们指的是同一个人。
(2)获取类(即字节码)的信息:
A.获取Constructor:
获得所有public的:getConstructors();
获取特定public的:.getConstructor(要获取的方法的参数对应的字节码列表);
获取所有的(public,protected,default,private):getDeclaredConstructors();
获取任意(public,protected,default,private)特有的:getDeclaredConstructors(StringBuffer.class);
注意:当使用带有Declared的方法获取成员,如果获取的是私有的,然后在使用这些私有成员之前,一定要使用.setAccessible(true);打开访问权限;
B.获取Field:类似获取获取构造函数,只是获取特定属性的时候传入的参数是属性名称对应的字符串(如获取int x ,那么传入的参数就是“x”);
C.获取Method;类似获取构造函数;
(3)使用Constructor:
创建对象:Constructor.newInstance(...);
(4)使用Field:
获取某个对象的属性值:Filed.get(对象名)
设置某个对象的属性值:Field.set(对象名,新的值)
(5)使用Method:
执行普通方法:Method.invoke(对象名,参数);
执行静态方法:Method.invoke(null,参数);
(6)使用Class的对象可以除了获取类的构造函数类,属性类,方法类外,还可以获取类的父类,类上的注解,类的描述信息
(7)获取了构造函数类、属性类,方法类后除了可以执行基本操作外,同样可以获取它们的修饰符以及注解信息等;