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
类型的实例。 - 如果构造函数异常(例如抛出异常),会抛出
InstantiationException
或InvocationTargetException
。
5. method.invoke(object, 4);
- 功能:调用
Apple
类的setPrice
方法。 invoke
是Method
类的方法,用来调用某个对象上的方法。它接收两个参数:object
:方法要调用的对象实例,前面通过构造器创建的Apple
实例。4
:调用方法时传递的参数值,此处传入4
,表示设置价格为 4。
setPrice
方法会将Apple
类实例的price
属性设置为 4。
反射的步骤总结:
- 通过
Class.forName()
动态加载指定的类。 - 使用
getMethod()
获取类中的某个方法。 - 使用
getConstructor()
获取类的构造函数。 - 使用
newInstance()
创建该类的一个对象实例。 - 使用
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;
}
}
总结:
这段代码通过反射机制动态加载类、获取构造方法和方法,然后调用方法来设置 Apple
实例的价格。它展示了如何通过反射在运行时动态地操作对象。
评论区