spring IOC AOP
反射
Java反射是一种强大的机制,允许程序在运行时动态地获取类的内部信息,并直接操作类的属性和方法。通过反射,开发者可以在运行时检查类、接口、字段和方法,并调用这些方法或访问这些字段,而无需在编译时知道它们的名称。反射主要通过java.lang.reflect包实现,提供了一系列类和接口,用于获取和操作类及其成员。反射在许多框架和库中被广泛使用,例如Spring框架的依赖注入。
反射在 Java 中主要通过 java.lang.reflect 包实现,这个包提供了一系列类和接口,用于在运行时获取和操作类及其成员。
以下是 Java 反射的一些主要功能和用法:
- 获取类的信息:
- 使用 Class.forName(String className) 动态加载类,并返回对应的 Class 对象。
- 使用 Object.getClass() 获取对象的 Class 对象。
- 使用 Class<?> clazz = MyClass.class; 获取类的 Class 对象(静态方式)。
- 获取类的成员信息:
- 使用 Class.getMethods() 获取类的所有公共方法。
- 使用 Class.getDeclaredMethods() 获取类的所有方法(包括私有方法)。
- 使用 Class.getFields() 获取类的所有公共字段。
- 使用 Class.getDeclaredFields() 获取类的所有字段(包括私有字段)。
- 创建对象实例:
- 使用 Class.newInstance() 创建类的实例(需要无参构造函数)。
- 使用 Constructor<T>.newInstance(...) 创建类的实例(可以使用带参数的构造函数)。
- 调用方法:
- 使用 Method.invoke(Object obj, Object... args) 调用对象的方法。
- 访问和修改字段:
- 使用 Field.get(Object obj) 获取对象的字段值。
- 使用 Field.set(Object obj, Object value) 设置对象的字段值。
参考:
Java的反射是什么?超详细+举例子+通俗易懂版!-CSDN博客
反射三种方式
获取反射中的Class对象
在反射中,要获取一个类或调用一个类的方法,我们首先需要获取到该类的 Class 对象。
在 Java API 中,获取 Class 类对象有三种方法:
第一种,使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。
Class clz = Class.forName("java.lang.String");
第二种,使用 .class 方法。
这种方法只适合在编译前就知道操作的 Class。
Class clz = String.class;
第三种,使用类对象的 getClass() 方法。
String str = new String("Hello"); Class clz = str.getClass();
通过反射创建类对象
通过反射创建类对象主要有两种方式:通过 Class 对象的 newInstance() 方法、通过 Constructor 对象的 newInstance() 方法。
第一种:通过 Class 对象的 newInstance() 方法。
Class clz = Apple.class;
Apple apple = (Apple)clz.newInstance();
第二种:通过 Constructor 对象的 newInstance() 方法
Class clz = Apple.class;
Constructor constructor = clz.getConstructor();
Apple apple = (Apple)constructor.newInstance();
通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法。下面的代码就调用了一个有参数的构造方法进行了类对象的初始化。
Class clz = Apple.class;
Constructor constructor = clz.getConstructor(String.class, int.class);
Apple apple = (Apple)constructor.newInstance("红富士", 15);
通过反射获取类属性、方法、构造器
我们通过 Class 对象的 getFields() 方法可以获取 Class 类的属性,但无法获取私有属性。
Class clz = Apple.class;
Field[] fields = clz.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
输出结果是:
price
而如果使用 Class 对象的 getDeclaredFields() 方法则可以获取包括私有属性在内的所有属性:
Class clz = Apple.class;
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName());
}
输出结果是:
name
price
与获取类属性一样,当我们去获取类方法、类构造器时,如果要获取私有方法或私有构造器,则必须使用有 declared 关键字的方法。
参考:大白话说Java反射:入门、使用、原理 - 陈树义 - 博客园
待完善