1、什么是反射
Java反射是指在程序运行时动态地获取和操作类、对象、方法等的能力。通过反射,我们可以在运行时检查类的属性和方法,并可以动态地创建、操作、调用对象,甚至可以修改类和对象的属性、方法。
2、反射的原理
反射的原理是基于Java的类加载机制和虚拟机的动态执行能力。在运行时,虚拟机会为每个类加载创建对应的Class对象,并在内存中存储类的结构信息。通过反射,我们可以在运行时获取这些信息并进行操作,从而实现动态的功能扩展。 JVM将字节码文件加载到内存,动态获取class对象。
3、反射能干什么
反射在Java中广泛应用于框架、动态代理、依赖注入等场景,它使得程序具有更大的灵活性和可扩展性。
4、反射的具体实现
(1)获取class对象
package com.toonyoo.spring.reflect;
import java.lang.reflect.InvocationTargetException;
public class RefelectTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// 1、类名.class 获取class对象
Class<User> c1 = User.class;
// 2、对象.getClass() 获取class对象
Class<? extends User> c2 = new User().getClass();
// 3、Class.forName("全路径") 获取class对象
Class<?> c3 = Class.forName("com.toonyoo.spring.reflect.User");
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
// 通过反射获取类对象
User user = (User) c3.getDeclaredConstructor().newInstance();
System.out.println(user);
}
}
(2)获取类的所有构造器
// 通过反射获取类的构造器
Constructor<?>[] constructors = c3.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println("构造器的名称" + constructor.getName() + " 构造器的参数个数" + constructor.getParameterCount() + " 构造器的参数类型" + constructor.getParameterTypes());
}
(3)获取类的属性
// 通过反射获取类的所有属性 Declared包含私有属性
Field[] fields = c3.getDeclaredFields();
for (Field field : fields) {
System.out.println("类的属性有"+ field);
}
(4)获取类的所有方法,包括私有方法
// 通过反射获取类的所有方法
Method[] methods = c3.getDeclaredMethods();
for (Method method : methods) {
System.out.println("方法名为"+method.getName());
}