Java的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java增加其灵活性与动态性的一种机制。
Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制。
类名 | 用途 |
---|---|
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量(成员变量也称为类的属性) |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造方法 |
Person类
public class Person {
private String name;
public int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private Person(String name) {
this.name = name;
this.age = age;
}
public Person(String name, int age) {
this.name = name;
}
public Person() {
}
public void hello() {
System.out.println("你好!");
}
private String getAddress(String address) {
System.out.println("我的地址:" + address);
return address;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Main:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception {
Class cls = Person.class;
//通过反射创建Person类的对象
Constructor cons = cls.getConstructor(String.class, int.class);
Object obj = cons.newInstance("Tom", 12);
Person p = (Person) obj;
System.out.println(p.toString());
//通过反射,调用对象指定的属性、方法
Field f = cls.getDeclaredField("age");
f.set(p, 10);
System.out.println(p.toString());
//调用方法
Method method = cls.getDeclaredMethod("hello");
method.invoke(p);
System.out.println("-----------------------------------------------");
//通过反射,调用Person类私有结构。比如:私有构造器、方法、属性
Constructor constructor = cls.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Person p1 = (Person) constructor.newInstance("Marry");
System.out.println(p1);
//调用私有属性
Field field = cls.getDeclaredField("name");
field.setAccessible(true);
field.set(p1, "zhangsan");
System.out.println(p1);
//调用私有方法
Method method1 = cls.getDeclaredMethod("getAddress", String.class);
method1.setAccessible(true);
String address = (String) method1.invoke(p1, "北京");
System.out.println(address);
}
}