何为反射
在 Java 中,反射是指在运行时检查和操作类、接口、字段、方法等程序结构的能力。通过反射,可以在运行时获取类的信息,创建类的实例,调用类的方法,访问和修改类的字段等。
我们知道在类中如果有私有属性的情况下,类外是无法访问到的,但反射能直接操作类私有属性。反射可以在运行时获取一个类的所有信息,(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。
反射我将其理解为将一个整体的类中成员变量 、方法等都解剖成一个一个的java对象
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。(其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象
反射的简单应用
public class User {
//私有属性
private int age = 18;
//公告属性
public String name = "zhangsan";
public void publicMethod(){
System.out.println("do public method");
}
private void privateMethod(){
System.out.println("do private method");
}
public static void staticMethod(){
System.out.println("do static method");
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
//1.反射 得到 对象
Class<?> clazz = Class.forName("User");
//2.得到方法
Method publicMethod = clazz.getDeclaredMethod("publicMethod");
//3.执行普通方法
publicMethod.invoke(clazz.getDeclaredConstructor().newInstance());
// 私有方法
Method privateMethod = clazz.getDeclaredMethod("privateMethod");
privateMethod.invoke(clazz.getDeclaredConstructor().newInstance());
//静态方法
Method staticMethod = clazz.getDeclaredMethod("staticMethod");
staticMethod.invoke(clazz.getDeclaredConstructor().newInstance());
//公共属性
Field field = clazz.getDeclaredField("name");
String name = (String) field.get(clazz.getDeclaredConstructor().newInstance());
System.out.println("name : " + name);
//私有属性
Field privateField = clazz.getDeclaredField("age");
int age = (int) privateField.get(clazz.getDeclaredConstructor().newInstance());
System.out.println("age : " + age);
}
}
代码执行结果如下: