反射
反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息。
这种通过Class实例获取class信息的方法称为反射(Reflection)
获取一个class的Class实例
方法一:直接通过一个class的静态变量class获取
java
Class cls = String.class;
方法二:如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:
java
String s = "Hello";
Class cls = s.getClass();
方法三:如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:
java
Class cls = Class.forName("java.lang.String");
访问字段
- Field getField(name):根据字段名获取某个public的field(包括父类)
- Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
- Field[] getFields():获取所有public的field(包括父类)
- Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
java
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
java
public class Main {
public static void main(String[] args) throws Exception {
Person p = new Person("Xiao Ming");
System.out.println(p.getName()); // "Xiao Ming"
// 通过反射获得 class
Class c = p.getClass();
// 获得字段
Field f = c.getDeclaredField("name");
// 设置私有字段可访问
f.setAccessible(true);
// 修改字段值
f.set(p, "Xiao Hong");
System.out.println(p.getName()); // "Xiao Hong"
}
}