该如何提高使用Java反射的效率?
大概有这些方法:
1,缓存要调用的类型、对象实例或方法,减少调用Class.forName、构造对象和 getMethod 的次数,如使用hashmap来缓存。如果要支持热部署,需要控制好缓存和版本的关系。
2,在缓存的基础上,尽量用接口来实现方法调用,而不是使用invoke。
吐槽下,java里没有委托(函数指针),干这事效率最高的就是使用委托。
Java反射到底慢在哪里?
先陈述一下结论:java的反射是慢,但是是相对于直接调用而言,慢也的确慢了一个数量级,不过在有些场景必须使用反射,并且在反射的时候,可以用一些手段进行人工优化
再说一下java反射之所以有一点慢的原因
1.java和python比起来,java是静态语言类型,也就是说在编译期java在编译代码的时候就会进行类型的强检验,java会在编译期进行代码优化,而反射是在运行时发生的,也就是说那些类型检查,代码优化的事情放在了运行时,这个自然要耗费一点时间
2.编译期在运行时很难做一些关于反射的优化,现在的编译期还不是非常智能,知道你用这段反射代码需要做什么事情
3.再说一下,调用实现过程,在反射调用过程中,执行者叫MethodAccessor,我记得这个对象是懒加载的,也就是说有可能第一次反射调用耗时可能会更长一点,并且在调用的时候method.invoke方法还要对参数数组进行包装,可能涉及到参数类型适配,装包拆包也有消耗,其实说到底,还是不知道具体的参数类型