Java 反射

来源:互联网 发布:加拿大预测软件 编辑:程序博客网 时间:2024/05/18 00:04

一、什么是反射
反射就是把Java类中的各种成分映射成相应的java类。
Java可以加载一个运行时才得知名称的class,获得其完整结构。

二、Class类
用一个类来描述Java类,这个类就叫做Class类。
Class类的每个实例对象代表一份字节码,即Java类的字节码。

1、获取类的Class对象
(1)运用.class
Class<?> classType4 = Boolean.class;
System.out.println(classType4);
输出:class java.lang.Boolean
(2)调用getClass
Boolean var1 = true;
Class<?> classType2 = var1.getClass();
System.out.println(classType2);
输出:class java.lang.Boolean
(3)运用static method Class.forName()
Class<?> classType5 = Class.forName("java.lang.Boolean");
System.out.println(classType5);
输出:class java.lang.Boolean
(4)运用primitive wrapper classes的TYPE
//这里返回的是九个预定义的Class实例对象,即原生类型,和Boolean.class返回的不同
Class<?> classType3 = Boolean.TYPE;
System.out.println(classType3);
输出:boolean

2、获取类的Constructor
(1)public Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个Constructor对象,它反映此Class对象所表示的类的指定公共构造方法
(2)public Constructor<?>[] getConstructors()
返回一个包含某些Constructor对象的数组,这些对象反映此Class对象所表示的类的所有公共构造方法
(3)public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
返回一个Constructor对象,该对象反映此Class对象所表示的类或接口的指定构造方法
(4)public Constructor<?>[] getDeclaredConstructors()
返回Constructor对象的一个数组,这些对象反映此Class对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法

3、新建类的实例
(1)调用类的Class对象的newInstance方法,该方法会调用对象的默认构造器,如果没有默认构造器,会调用失败。
Class<?> classType = String.class;
Object inst = classType.newInstance();
System.out.println(inst);
输出:
Type:Default Constructor
String:Default Constructor
com.quincy.String@d80be3
(2)调用默认Constructor对象的newInstance方法
Class<?> classType = String.class;
Constructor<?> constructor1 = classType.getConstructor();
Object inst = constructor1.newInstance();
System.out.println(inst);
输出:
Type:Default Constructor
String:Default Constructor
com.quincy.String@1006d75
(3)调用带参数Constructor对象的newInstance方法
Constructor<?> constructor2 = classType.getDeclaredConstructor(String.class);
Object inst = constructor2.newInstance("123");
System.out.println(inst);
输出:
Type:Default Constructor
String:Constructor with parameters
com.quincy.String@15e83f9

4、获取类的Fields
(1)public Field getField(String name)
返回一个Field对象,它反映此Class对象所表示的类或接口的指定公共成员字段
(2)public Field[] getFields()
返回一个包含某些Field对象的数组,这些对象反映此Class对象所表示的类或接口的所有可访问公共字段
(3)public Field getDeclaredField(String name)
返回一个Field对象,该对象反映此Class对象所表示的类或接口的指定已声明字段
(4)public Field[] getDeclaredFields()
返回Field对象的一个数组,这些对象反映此Class对象所表示的类或接口所声明的所有字段
(5)getFields和getDeclaredFields区别:
getFields返回的是申明为public的属性,包括父类中定义;
getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。

5、设置/获取类的属性值
(1)getFields得到的属性可以通过field1.get(cls1)获得对象cls1的属性值,
field1.set(cls1,value)设置对象cls1的属性值;
(2)getDeclaredFields得到的属性可以通过先field1.setAccessible(true)方法暴力反射,
然后再通过field1.get(cls1)获得对象cls1的属性值。

6、获取类的Method
(1)public Method getMethod(String name, Class<?>... parameterTypes)
返回一个Method对象,它反映此Class对象所表示的类或接口的指定公共成员方法
(2)public Method[] getMethods()
返回一个包含某些Method对象的数组,这些对象反映此Class对象所表示的类或接口(包括

那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member方法
(3)public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
返回一个Method对象,该对象反映此Class对象所表示的类或接口的指定已声明方法
(4)public Method[] getDeclaredMethods()
返回Method对象的一个数组,这些对象反映此Class对象表示的类或接口声明的所有方法,

包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法

7、调用类的函数
(1)通过反射获取类Method对象,调用Field的Invoke方法调用函数。
methodCharAt.invoke(str1,1);//相当于str1.charAt(1);
method1.invoke(null,1);//类的静态方法
(2)对接收数组参数的成员方法进行反射,因为数组别编译成多个参数,即可变参数。
mainMethod.invoke(null,new Object[](new String[]("111","222","333")));
mainMethod.invoke(null,(Object)(new String[]("111","222","333")));

原创粉丝点击