反射
介绍反射
反射(Reflection) 是 Java 语言提供的一种动态机制,允许在运行时获取类的结构信息(如类名、方法、构造器、字段等),并可以创建对象、调用方法、访问字段,即使在编译时类型未知。
反射就是在运行时才具体知道要操作的类是什么结构,并在运行时获取类的完整构造,并调用对应的方法、属性
Java的反射主要包括以下三个部分:
- 类的加载:Java的类在需要使用时才会被加载到JVM中。这个过程是由类加载器(ClassLoader)完成的。类加载器首先检查这个类是否已经被加载过,如果还没有加载,那么就会从磁盘上加载类的字节码并创建一个Class对象。
- 获取类的信息:当一个对象被创建后,我们可以使用反射来获取这个对象的Class对象。通过这个Class对象,我们可以获取到这个类的所有属性和方法。
- 方法的调用:通过反射,我们可以动态的调用一个对象的方法。即使这个方法是一个私有的方法,也能够通过反射来调用。
反射的使用
- 获取Class对象
- 使用Class.forName()方法,参数为需要获取的类的全限定名
- 通过类的class属性
Class<?> clazz1 = Class.forName("User"); //推荐用于动态加载类
Class<?> clazz2 = User.class;
- 获取构造方法(可用来实例化对象)
- getConstructor(Class...<?> parameterTypes):获得该类中与参数类型匹配的公有构造方法
- getConstructors():获取所有共有的构造方法
- getDeclaredConstructors():获取所有的构造方法
// 获得共有的构造方法
Constructor<?>[] cons1 = clazz1.getConstructors();
// 获得所有的构造方法
Constructor<?>[] cons2 = clazz1.getDeclaredConstructors();
// 获得指定参数类型的构造方法(公有的)
Constructor<?> cons3 = clazz1.getConstructor(String.class,int.class);
//创建实例对象
User user = (User)cons3.newInstance("user",18);
System.out.println(user);
- 获取类的方法
- getMethods():获取所有的公有的方法
- getDeclaredMethods():获取所有的方法
- getMethod(String name, Class...<?> paramerterTypes):获得某个公有方法,第一个参数为方法名,之后的参数为想要获取的方法的形参列表的数据类型
//say(String message) 方法
Method method1 = clazz1.getDeclaredMethod("say", String.class);
Method[] method2 = clazz1.getMethods();
Method[] method3 = clazz1.getDeclaredMethods();
- 调用方法
- method.invoke():其中的第一参数为要调用该方法的对象,之后为方法的形参
//获取Class 对象
Class<?> clazz1 = Class.forName("User");
//获取构造方法
Constructor<?> cons3 = clazz1.getConstructor(String.class,int.class);
//获取User的实例对象
User user = (User)cons3.newInstance("user",18);
//获取方法
Method method1 = clazz1.getDeclaredMethod("say", String.class);
//调用方法
method1.invoke(user,"hello");
- 获取类的字段
- getField(String name):获得某个公有的属性对象
- getFields():获得所有的公有的属性对象
- getDeclaredFields():获得所有属性对象
Field[] fields = clazz1.getFields();
Field name = clazz1.getField("name");
Field[] declaredFields = clazz1.getDeclaredFields();
反射的应用场景
- 框架开发(如 Spring、Mybatis):动态创建对象、调用方法、设置字段。
- 插件系统:动态加载类,无需在编译时指定具体类。
- 序列化/反序列化:JSON/XML 解析时,反射用于动态获取类属性。
- 测试框架(如 JUnit):通过反射自动调用测试方法。
- 动态代理:拦截方法调用,如 AOP(面向切面编程)。
评论区