Spring框架的IOC是基于Java反射机制实现的。
1 反射
反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
Oracle 官方说明:
Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.
The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.
Java反射机制
- 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
- 对于任意一个对象,都能够调用它的任意方法和属性;
1.1 创建实体类
package com.giser.java.reflect;
/**
* @author giserDev
* @description
* @date 2024-01-03 21:54:07
*/
public class Car {
//属性
private String name;
private int age;
private String color;
//无参数构造
public Car() {
}
//有参数构造
public Car(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
}
//普通方法
private void run() {
System.out.println("私有方法执行。。。");
}
//get和set方法
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;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", age=" + age +
", color='" + color + '\'' +
'}';
}
}
1.2 反射测试
1.2.1 获取class对象
@Test
public void test01() throws Exception {
// 1 通过类名获取
Class<Car> carClazz1 = Car.class;
// 2 通过对象获取
Class<? extends Car> carClazz2 = new Car().getClass();
// 3 通过Class.forName()获取
Class<?> carClazz3 = Class.forName("com.giser.java.reflect.Car");
// 实例化
Car car = carClazz1.getConstructor().newInstance();
System.out.println(car);
}
1.2.2 获取构造方法
@Test
public void test02() {
Class carClazz = Car.class;
// 获取所有的public构造方法