反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java 语言的反射机制。
java反射机制可以让我们在编译期之外的运行期检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,获取|设置变量的值。
要获取类信息首先要获取到Class对象,Class类没有Public的构造方法,Class类的实例都是在JVM在加载类时通过调用Classloader的defineClass方法下创建的。
Java 反射机制,可以实现以下功能:
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理
注意:
- 在创建类型的对象时,获取的是类型的Class对象的一个镜像|复制体
- 在一个类加载到内存时就会存在这个类型唯一的Class对象(方法、属性、构造器。。。。)
- 如果能够拿到一个类型的Class对象,就可以操作这个类
获取一个类型的Class对象的方式:
- 类名.class
- 对象.getClass()
- Class.forName(“包名.类名”)//一般尽量采用形式
常用方法:
- Class<?>[] getInterfaces() 返回当前Class对象所表示的类|接口所实现的接口的Class对象数组
- int getModifiers() 返回此类或接口以整数编码的 Java 语言修饰符
- String getSimpleName() 返回类名
- boolean isPrimitive() 判定指定的 Class 对象是否表示一个基本类型
Class中的常用方法(操作构造器,操作方法,操作字段…)
-
通过反射获取类中构造器:
- Constructor getConstructor(Class<?>… parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
- Constructor<?>[] getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。
- Constructor getDeclaredConstructor(Class<?>… parameterTypes) 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。
- Constructor<?>[] getDeclaredConstructors() 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
- 通过反射创建对象:
1.Constructor->newInstance(参数的class对象…)
2.Class类中newInstance()
-
通过反射获取方法:
-
Method getDeclaredMethod(String name, Class<?>… parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
-
Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
-
Method getMethod(String name, Class<?>… parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
-
Method[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
-
通过反射执行方法:
Object invoke(Object obj, Object… args) 返回值:调用执行的方法的返回值。 obj - 从中调用底层方法的对象
args - 用于方法调用的参数
-
-
通过反射获取字段:
- Field getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
- Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
- Field getField(String name) 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
- Field[] getFields() 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
- 操作字段:
- 设置值 void set(Object obj, Object value)将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
- 获取值 Object get(Object obj)返回指定对象上此 Field 表示的字段的值。
- 设置值 void set(Object obj, Object value)将指定对象变量上此 Field 对象表示的字段设置为指定的新值。