Class类的实例对应着一个运行时类。加载到内存中的运行时类,会缓存一定的时间,在此时间内,我们可以通过不同的方式获得该运行时的类。
经过反射后的对象可以调用运行时类的私有结构。
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test{
public static void main(String[] args) throws Exception {
//没有反射
Person person = new Person("Tom",22); //1.创建类的对象
person.age = 23; //2.通过对象调用属性和方法。不可以调用私有结构
person.introduction();
//反射
//1.获取Class的实例
Class class1 = Person.class; //方式一
Person person2 = new Person();
Class class2 = person2.getClass(); //方式二
Class class3 = Class.forName("Person"); //方式三
System.out.println(class1 == class2); //true 他们都指向同一个运行时类
System.out.println(class1 == class3); //true
//2.创建运行时类的对象
Person person1 = (Person) class1.newInstance(); //相当于调用了运行时类的空参构造器,因此运行时类必须提供一个空参构造器
//3.调用运行时类中的属性和方法
Field name = class1.getDeclaredField("name"); //①getDeclaredField(String fieldName):获取运行时类中指定变量名的属性
name.setAccessible(true); //②保证当前属性是可访问的
name.set(person1,"Joe"); //③set():参数1指明要设置哪个对象的属性,参数2指明将此属性设置为多少
System.out.println(name.get(person1)); //get():参数指明要获取哪个对象的属性
Method showNation = class1.getDeclaredMethod("showNation", String.class); //①getDeclaredMethod():参数1指明获取的方法名称,参数2指明获取方法的形参列表
showNation.setAccessible(true); //②保证当前方法是可访问的
showNation.invoke(person1,"USA"); //③invoke():参数1指明调用该方法的对象,参数2给方法的形参赋值
//调用静态属性和方法
Field sex = class1.getDeclaredField("sex");
sex.setAccessible(true);
sex.set(Person.class,"boy");
System.out.println(sex.get(Person.class));
Method show = class1.getDeclaredMethod("show");
show.setAccessible(true);
show.invoke(Person.class);
}
}
class Person{
private String name;
public int age;
private static String sex;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Person() {
}
private Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void introduction(){
System.out.println("name: " + name + ", age: " + age);
}
private String showNation(String nation){
System.out.println("nation: " + nation);
return nation;
}
private static void show(){
System.out.println("人");
}
}