概念介绍
Java反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Class类
- 在Java语言中,静态的成员、普通数据类型不是对象。类是对象,类是java.lang.Class类的实例对象
- 如何表示?
Class c1 = Foo.class;
Class c2 = foo1.getClass(); //foo1是Foo类的实例对象
Class c3 = Class.forName("com.niaoge2016.Foo");
// 可以通过Class创建该类的实例对象
Foo foo1 = (Foo)c1.newInstance(); - 基本的数据类型
void等关键字,都存在Class(类类型)
动态加载类
编译时刻加载类是静态加载类,运行时刻加载类是动态加载类。
- new创建对象是静态加载类,在编译时刻就需要加载所有可能用到的类。
- 上面的Class.forName("类的全称")不仅表示类的类类型,还代表了动态加载类,只有在运行时刻用到该类时才进行加载。
功能总结
Class类的基本API
Class c = obj.getClass();
获取类的名称
c.getName();获取方法
// 获取此Class对象表示的类或接口中指定的公共成员方法
Method m1 = c.getMethod(String name,Object ...);
// 获取所有的public函数,包括父类继承来的
Method[] ms1 = c.getMethods();
// 获取此Class对象表示的类或接口中指定的已声明方法
Method m2 = c.getDeclaredMethod(String name,Object ...);
// 获取所有该类自己声明的方法,不问访问权限(公共,保护,包,私有),不包括从父类继承的方法
Method[] ms2 = c.getDeclaredMethods();
- 获取成员变量
// 获取此Class对象表示的类或接口中指定的公共成员变量
Field f1 = c.getField(String name);
// 获取所有的public成员变量信息,包括父类继承来的
Field[] fs1 = c.getFields();
// 获取此Class对象表示的类或接口中指定的已声明成员变量
Field f2 = c.getDeclaredField(String name);
// 获取所有该类自己声明的成员变量信息,不问访问权限(公共,保护,包,私有),不包括从父类继承的成员变量信息
Field[] fs2 = c.getDeclaredFields();
- 获取类的构造器
// 获取此Class对象表示的类中指定的类构造方法
Constructor c1 = c.getConstructor(Class<?> ...);
// 获取此Class对象表示的类中所有公共的类构造方法
Constructor[] cs1 = c.getConstructors();
// 获取此Class对象表示的类或接口中指定的类构造方法
Constructor c2 = c.getDeclaredConstructor(Class<?> ...);
// 获取此Class对象表示的类的所有类构造方法,不问访问权限(公共,保护,包,私有),不包括从父类继承的类构造方法
Constructor[] cs2 = c.getDeclaredConstructors();
- 新建类的实例
// 调用类的Class对象的newInstance()方法
Object inst = c.newInstance();
// 调用默认Constructor对象的newInstance()方法
Constructor c3 = c.getConstructor();
Object inst = c3.newInstance();
// 调用带参数的Constructor对象的newInstance()方法
Constructor c4 = c.getDeclaredConstructor(int.class,String.class);
Object inst = c4.newInstance(1,"abc");
方法反射的基本操作
- 如何获取某个方法
方法的名称和方法的参数列表才能唯一确定某个方法 - 方法反射的操作
m1.invoke(对象,可变参数列表)
参数列表根据实际情况,可以传数组Object[],也可以传具体参数列表,如:
m1.invoke(a1,new Object[]{10,20}); 或者
m1.invoke(a1,10,20);