1.概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。
而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。
2.反射获取字节码对象方式、创建对象的两种方式
获取字节码方式三种:
(1)类名.class,例如:System.class
(2)对象.getClass(),例如:new Date().getClass();
(3)Class.forName("类名"),例如:Class.forName("java.util.Date");
创建对象的两种方式:
(1)直接用字节码创建对象,只能调用默认的构造方法:字节码.newInstance();
(2)获取构造方法Constructor,然后调用构造方法创建,可以通过参数不同调用不同的构造方式
3、通过反射获取带参构造方法并使用
A,获取字节码文件对象
Class.forName(String classPath)
B.Class类提供了newInstance()方法,使用无参构造创建一个新对象
C.通过字节码文件对象获取构造器对象
getConstructor(Class... parameterTypes); // 获取公共构造中的一个
getDeclaredConstructor(Class... parameterTypes); // 获取所有中的一个
setAccessible(true); // 取消java语言访问检查
D.通过构造器对象创建类的实例
Constructor类提供的newInstance(Object... parameters)
4、通过反射获取成员变量并使用
A.获取字节码文件对象
Class.forName(String classPath)
B.通过字节码文件对象获取构造器对象
getConstructor(Class... parameterTypes); // 获取公共构造中的一个
getDeclaredConstructor(Class... parameterTypes); // 获取所有中的一个
setAccessible(true);
C.通过构造器对象创建类的实例
Constructor类提供的newInstance(Object... parameters)
D.通过字节码文件对象获取字段(Field) -- 成员变量、属性、域、字段
getField(String name); // 获取公共字段中的一个
getDeclaredField(String name);// 获取所有字段中的一个
setAccessible(boolean flag); // 暴力访问(取消java语言访问检查)
F.使用字段
Field类的方法 set(Object obj, Object value); // 为obj对象的字段赋值为value
5、通过反射获取方法并使用 -- Method
A.获取字节码文件对象
Class.forName(String classPath)
B.通过字节码文件对象获取构造器对象
getConstructor(Class... parameterTypes); // 获取公共构造中的一个
getDeclaredConstructor(Class... parameterTypes); // 获取所有中的一个
setAccessible(true);
C,通过构造器对象创建类的实例
Constructor类提供的newInstance(Object... parameters)
D,通过字节码文件对象获取方法
getMethod(String name, Class... parameterTypes) // 获取公共中的一个(包含父类的)
getDeclaredMethod(String name, Class... parameterTypes) // 获取所有中的一个(不包含父类的)
setAccessible(true);
F,通过方法对象执行方法
Method类提供功能 Object invoke(Object obj, Object... objs) // 不必手动封装成数组new Object[]{obj1, obj2, obj3}
6、怎么理解反射,反射的应用
反射就是把Java类中的各种成分映射成相应的Java类。
一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方法来解决问题。
反射是一个正好相反的过程,开始可能并没有类可以解决这个问题,而我们却先用一个当时可能并不存在的方法解决了这个问题,后来才有的这个类。
这其实就是框架的原理,现有的框架再有的解决问题的类。框架描述了整体,制订了功能方法的规范,具体的实现之后按照这个规范编写。这些都需要靠反射来完成。
使用框架有良好的扩展性,某部分功能的优化不需要涉及程序整体,只需要修改特定的部分就好了,然后通过配置文件,获取对应的类名,就可以了。
|
|