反射怎么理解,(个人白话理解,有个类,类中有很多属性、方法、构造器,可以通过一面镜子将类里面的东西像光一样反射出来,被我们看到和使用,reflecttion其实也可以理解为映像,主要为了获取类中私有的东西,通过.获取不到的东西)
总体就是,加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)
而反射的第一步就是加载类,获取类的字节码Class对象,获取的方式有三种
1.直接使用类名.class获取:Class c1=类名.class
2.调用Class提供的方法:Class c2=Class.forName("全类名")
3.调用Object提供的方法:Class c3=对象.getClass()
Class c1 = Person.class;
Class c2 = Class.forName("com.example.Person");
Person person = new Person();
Class c3 = person.getClass();
后续就可以从类中获取构造器、成员变量、成员方法
java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello() {
System.out.println("Hello, my name is " + name + ", I'm " + age + " years old.");
}
}
public class Main {
public static void main(String[] args) throws Exception {
// 获取类对象
Class<?> clazz = Person.class;
// 获取构造器并创建对象
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Person person = (Person) constructor.newInstance("John", 30);
// 获取属性并设置值
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(person, "Mike");
// 调用方法
Method sayHelloMethod = clazz.getMethod("sayHello");
sayHelloMethod.invoke(person);
}
}
上述中public void setAccessible(boolean flag),将参数改为true,就能开启暴力反射,破坏私有成员变量的封装性,获取一些正常操作获得不到的东西(实体类定义私有属性也能应用了),这也是反射的主要应用(不过使用需小心谨慎),很适合做Java的框架,主流的框架都会基于反射设计出一些通用的功能。