侧边栏壁纸
博主头像
MD_Tech_博客

行动起来,活在当下

  • 累计撰写 8 篇文章
  • 累计创建 8 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Java反射机制

Siuux_7
2025-03-03 / 0 评论 / 0 点赞 / 11 阅读 / 0 字

反射

介绍反射

反射(Reflection) 是 Java 语言提供的一种动态机制,允许在运行时获取类的结构信息(如类名、方法、构造器、字段等),并可以创建对象、调用方法、访问字段,即使在编译时类型未知。

反射就是在运行时才具体知道要操作的类是什么结构,并在运行时获取类的完整构造,并调用对应的方法、属性

Java的反射主要包括以下三个部分:

  • 类的加载:Java的类在需要使用时才会被加载到JVM中。这个过程是由类加载器(ClassLoader)完成的。类加载器首先检查这个类是否已经被加载过,如果还没有加载,那么就会从磁盘上加载类的字节码并创建一个Class对象。
  • 获取类的信息:当一个对象被创建后,我们可以使用反射来获取这个对象的Class对象。通过这个Class对象,我们可以获取到这个类的所有属性和方法。
  • 方法的调用:通过反射,我们可以动态的调用一个对象的方法。即使这个方法是一个私有的方法,也能够通过反射来调用。
    java反射.png

反射的使用

  • 获取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(面向切面编程)。
0

评论区