一、Java 反射机制
Java
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java
语言的反射机制。
反射关键API:java.lang.Class+java.lang.reflect
1、首先我们创建一个 Car 类:
java">
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Car {//属性private String name;private int age;private String color;//普通方法private void run() {System.out.println("私有方法-run.....");}
}
2、通过反射获取类并实例化:
java">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);}}}
}