最近学习spring源码时,发现反射的掌握相对薄弱,所以回来学习了下反射。
在练习中发现反射调用的效率与普通调用相比,效率要低很多,证明如下:
1.首先声明一个cat的实体类:
public class Cat {
public void eat(){
//System.out.println("猫咪爱吃肉");
}
}
2.在测试类中传统方式调用eat方法
public static void m1(){
Cat cat=new Cat();
long start=System.currentTimeMillis();
for(int i=0;i<90000000;i++){
cat.eat();
}
long end=System.currentTimeMillis();
System.out.println("m1耗时"+(end-start));
}
3.反射调用eat方法
public static void m2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//获取cat的class类
Class cla = Class.forName("cn.com.hyundai.ubi.api.entity.Cat");
//声明一个
Object o = cla.newInstance();
Method method=cla.getMethod("eat");
long start=System.currentTimeMillis();
for(int i=0;i<90000000;i++) {
method.invoke(o);
}
long end =System.currentTimeMillis();
System.out.println("m2耗时"+(end-start));
}
4.比较运行时间
m1耗时47
m2耗时3789
我们可以看出反射的运行效率还是很低的,但是Method、Filed、Constructor有一个共同的方法
setAccessible(boolean)//启动和禁用安全检查的开发,true时表示禁用安全检查,提高反射效率,false时启用;
Method method=cla.getMethod("eat");
method.setAccessible(true);//
long start=System.currentTimeMillis();
for(int i=0;i<90000000;i++) {
method.invoke(o);
}
long end =System.currentTimeMillis();
System.out.println("m2耗时"+(end-start));
m1耗时23
m2耗时909