java反射机制允许程序在运行时进行自我检查,同时也允许对其内部的成员变量进行操作。主要功能有:得到一个对象所属的类,获取一个类的所有成员变量和方法,在运行时创建对象,在运行时调用对象的方法。以下直接通过代码展示。
package functions;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
// 必须要public类型
public String p1;
public String p2;
ReflectTest() {
p1 = "1";
p2 = "2";
}
public ReflectTest(String p1) {
this.p1 = p1;
}
public ReflectTest(String p1, String p2) {
this.p1 = p1;
this.p2 = p2;
}
public void sayHello(String hello) {
System.out.println(hello);
}
public static void main(String[] args) {
try {
/**
* 获取对象所属的类
*
* 第1种方式:调用对象的getClass()方法
*
* 第2种方式:调用类的Class方法
*
* 第3种方式:Class.forName
*/
System.out.println("===获取一个对象所属的类,通常用第三种方式实现===");
ReflectTest reflectTest = new ReflectTest();
Class c1 = reflectTest.getClass();
System.out.println(c1.getName());
Class c2 = ReflectTest.class;
System.out.println(c2.getName());
// 必须传入完整的包名
Class c3 = Class.forName("functions.ReflectTest");
System.out.println(c3.getName());
System.out.println("===获取Class对象的所有公有构造方法===");
/**
* 获取Class对象的所有构造方法
*/
// 所有公有构造方法
Constructor[] constructors1 = c1.getConstructors();
for (Constructor constructor : constructors1) {
System.out.println(constructor);
}
System.out.println("===获取Class对象的所有构造方法===");
// 所有构造方法
Constructor[] constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
/**
* 获取成员变量
*/
System.out.println("===获取成员变量===");
Field[] fields = c1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
/**
* 运行时创建对象
*/
System.out.println("===运行时创建对象===");
ReflectTest reflectTest2 = (ReflectTest) c1.newInstance();
System.out.println(reflectTest2.p2);
/**
* 在运行时调用对象的方法
*/
System.out.println("===在运行时调用对象的方法===");
Method m = c1.getMethod("sayHello", String.class);
ReflectTest reflectTest3 = (ReflectTest) c1.newInstance();
m.invoke(reflectTest2, "China");
/**
* 运行时调用对象的属性
*/
System.out.println("===运行时调用对象的属性===");
Field f = c3.getField("p1");
ReflectTest reflectTest4 = new ReflectTest();
f.set(reflectTest4, "2323");
System.out.println(reflectTest4.p1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果如下: