JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
接下来我会给个例子展示
public class ReflectTest {
public static void main(String[] args) throws Exception {
// 获取类
Class<Demo> c = Demo.class;
Object o = c.newInstance();
// 获取成员变量,get,set必须是同一个object,否则输出默认的11
Field idF = c.getDeclaredField("id");
idF.setAccessible(true);
idF.set(o, "110");
System.out.println(idF.get(o));
// 获取无参函数,invoke参数为o是表示同一个实例,输出之前存储的110,如果是c.newInstance()输出默认的11
Method method = c.getDeclaredMethod("printId");
method.setAccessible(true);
method.invoke(o);
// 获取有参函数
Method method1 = c.getDeclaredMethod("print", String.class);
method1.setAccessible(true);
method1.invoke(o, "hello");
Class<?>[] class1 = c.getDeclaredClasses();
for (Class<?> cls : class1) {
if (cls.getName().contains("Inner")) {
// 构造成员内部类实例
Constructor<?> con2 = cls.getDeclaredConstructor(c);
con2.setAccessible(true);
Inner inner = (Inner) con2.newInstance(o);
inner.run();
} else if (cls.getName().contains("StaticInstance")) {
// 构造静态内部类实例
StaticInstance instance = (StaticInstance) cls.newInstance();
instance.run();
}
}
// 获取匿名内部类实例(要求:已经生成对应的实例,也就是已经new过了)
Field field = c.getDeclaredField("inner2");
field.setAccessible(true);
Inner r = (Inner) field.get(o);
r.run();
}
}
class Demo {
private String id = "11";
private void printId() {
System.out.println(id);
}
private void print(String content) {
System.out.println(content);
}
private Inner inner;
private Inner inner2 = new Inner();
class Inner {
public void run() {
System.out.println("inner-running");
}
}
private StaticInstance staticInstance;
static class StaticInstance {
public void run() {
System.out.println("staticInstance-running");
}
}
}