反射除了获取属性,也可以获取方法,调用方法。
- 获取实例方法:
Method method = clazz.getMethod("describe");
2.调用实例方法:method.invoke(v);
package day14;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestReflect {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
MerchandiseV2 v = new MerchandiseV2(1,"床单",100, 50, 30);
// 另一种获取Class类的方法:
Class clazz = MerchandiseV2.class;
// 方法
Method method = clazz.getMethod("describe");
method.invoke(v);
v.describe();
}
}
运行结果:
image.png
二、如何访问私有的方法呢?
- 通过
clazz.getDeclaredMethod("describe")
获取声明的方法 - 通过
method.setAccessible(true)
设置方法可以调用
属性的访问同理。
image.png
三、通过反射和直接通过实例变量获取属性和方法的差异?
获取的效率差异:反射访问慢于直接获取。
当对于方法的执行时间来说两者是一样的。
建议:获取属性或者方法的时候,将该对象保存起来,可以从很大程度上减少效率的差异。
可以类比理解:直接访问就好比知道了你去找一个地方知道了坐标,直接飞过去。通过反射的话,相当于通过一步一步左转,右转,直行到达。虽然慢了,同样可以达到目的地。
网友评论