侧边栏壁纸
  • 累计撰写 9 篇文章
  • 累计创建 5 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

java中的反射

Lieey
2025-01-17 / 0 评论 / 0 点赞 / 6 阅读 / 5380 字

java中的反射

实例代码:


Class clz = Class.forName("com.chenshuyi.reflect.Apple");
Method method = clz.getMethod("setPrice", int.class);
Constructor constructor = clz.getConstructor();
Object object = constructor.newInstance();
method.invoke(object, 4);

代码详解

这段代码使用 Java 的反射机制动态加载类,并执行构造方法和调用实例方法。我们可以逐步分析这段代码:

1. Class clz = Class.forName("com.chenshuyi.reflect.Apple");

  • 功能:通过类名字符串加载指定的类 Apple
  • Class.forName 是反射 API 中的方法,用于加载并返回指定名称的类。这个方法接收一个字符串参数,表示类的完全限定名(包括包名),返回的是该类的 Class 对象。
  • 在这个例子中,类 Apple 应该位于 com.chenshuyi.reflect 包中。如果该类不存在或无法加载,会抛出 ClassNotFoundException

2. Method method = clz.getMethod("setPrice", int.class);

  • 功能:通过反射获取 Apple 类中的 setPrice 方法。
  • getMethod 方法返回一个 Method 对象,它表示类中某个公共的方法。
  • "setPrice":指定要获取的方法名称。
  • int.class:指定 setPrice 方法的参数类型为 int
    • 这里 int.class 是 Java 中的基本类型 int 对应的 Class 对象,它是用来表示参数类型的。可以用类似 String.class 来表示字符串类型。
  • 该代码假定 Apple 类中确实有一个公共的 setPrice 方法,它接受一个 int 类型的参数。

3. Constructor constructor = clz.getConstructor();

  • 功能:通过反射获取 Apple 类的默认构造函数。
  • getConstructor() 是反射 API 中的方法,用来获取指定的构造函数。没有参数时,表示无参构造函数。
  • 如果 Apple 类没有无参构造函数,调用此方法会抛出 NoSuchMethodException

4. Object object = constructor.newInstance();

  • 功能:使用无参构造函数创建 Apple 类的一个新实例。
  • newInstance() 方法通过反射创建一个类的新实例,相当于使用 new Apple()
  • 它会调用 Apple 类的无参构造函数来创建一个对象,并返回 Object 类型的实例。
  • 如果构造函数异常(例如抛出异常),会抛出 InstantiationExceptionInvocationTargetException

5. method.invoke(object, 4);

  • 功能:调用 Apple 类的 setPrice 方法。
  • invokeMethod 类的方法,用来调用某个对象上的方法。它接收两个参数:
    • object:方法要调用的对象实例,前面通过构造器创建的 Apple 实例。
    • 4:调用方法时传递的参数值,此处传入 4,表示设置价格为 4。
  • setPrice 方法会将 Apple 类实例的 price 属性设置为 4。

反射的步骤总结:

  1. 通过 Class.forName() 动态加载指定的类。
  2. 使用 getMethod() 获取类中的某个方法。
  3. 使用 getConstructor() 获取类的构造函数。
  4. 使用 newInstance() 创建该类的一个对象实例。
  5. 使用 invoke() 调用实例方法并传入参数。

潜在异常:

  • ClassNotFoundException:如果 Apple 类找不到,forName() 会抛出该异常。
  • NoSuchMethodException:如果找不到指定的方法或构造函数,getMethod()getConstructor() 会抛出该异常。
  • InstantiationException:如果创建实例时出错,newInstance() 会抛出该异常。
  • InvocationTargetException:如果在调用方法时该方法内部抛出了异常,invoke() 会抛出该异常。

代码示例中的 Apple 类(假设):

package com.chenshuyi.reflect;

public class Apple {
    private int price;

    // 默认构造函数
    public Apple() {
        this.price = 0;  // 默认为 0
    }

    // 设置价格方法
    public void setPrice(int price) {
        this.price = price;
    }

    public int getPrice() {
        return this.price;
    }
}

image-vuux.png

总结:

这段代码通过反射机制动态加载类、获取构造方法和方法,然后调用方法来设置 Apple 实例的价格。它展示了如何通过反射在运行时动态地操作对象。

参考文档

0

评论区