比较反射与传统方式调用的运行效率与反射的优化

本文通过对比Spring源码中直接调用与反射调用猫类实例的eat方法,揭示了反射效率较低的问题,并探讨了setAccessible方法对提升反射性能的作用。作者详细介绍了如何通过设置安全检查来优化反射调用,以提高代码执行速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值