【Spring】第二弹:通过反射机制初步理解 IoC
一、Java 反射机制
Java
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java
语言的反射机制。
反射关键API:java.lang.Class+java.lang.reflect
1、首先我们创建一个 Car 类:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {
//属性
private String name;
private int age;
private String color;
//普通方法
private void run() {
System.out.println("私有方法-run.....");
}
}
2、通过反射获取类并实例化:
public class ReflectCar {
/**
* 输出结果:
* class Ioc.Car
* class Ioc.Car
* class Ioc.Car
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// 获取Car类的三种方式
Class<Car> carOldClass = Car.class;
System.out.println(carOldClass);
Class<? extends Car> newClass = new Car().getClass();
System.out.println(newClass);
Class<?> carClass = Class.forName("Ioc.Car"); //Car类的全路径
System.out.println(carClass);
/**
* 获取Car的构造方法:无参构造和带参构造
* 方法名称:Ioc.Car 参数个数:0
* 方法名称:Ioc.Car 参数个数:3
*/
Constructor<?>[] carClassDeclaredConstructors = carClass.getDeclaredConstructors();
for (Constructor<?> constructor : carClassDeclaredConstructors) {
System.out.println("方法名称:"+constructor.getName()+" 参数个数:"+constructor.getParameterCount());
}
/**
* 通过构造方法创建对象
* Car(name=null, age=0, color=null)
* Car(name=小黄车, age=1, color=黄色)
*/
Constructor<?> declaredConstructor1 = carClass.getDeclaredConstructor();
Car car1 =(Car) declaredConstructor1.newInstance();
System.out.println(car1);
Constructor<?> declaredConstructor2 = carClass.getDeclaredConstructor(String.class, int.class, String.class);
Car car2 = (Car)declaredConstructor2.newInstance("小黄车", 1, "黄色");
System.out.println(car2);
/**
* 通过反射获取属性
* Car(name=小绿车, age=1, color=黄色)
* name
* age
* color
*/
Field[] declaredFields = carClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
if(declaredField.getName().equals("name")){
declaredField.setAccessible(true);
declaredField.set(car2,"小绿车");
System.out.println(car2);
}
System.out.println(declaredField.getName());
}
/**
* 通过反射获取私有化方法
* 私有方法-run.....
*/
Method[] methods = carClass.getDeclaredMethods();
for (Method method : methods) {
//执行方法
if (method.getName().equals("run")){
method.setAccessible(true);
Object object = method.invoke(car2);
}
}
}
}