为什么反思慢?

是因为我们应该加载类(例如通过string ),创建实例,然后搜索适当的方法,打包参数,然后只调用方法? 所以大部分时间花在这些操作上而不是对象上的显式方法调用,对吗?

每次使用reflection时,每次采取步骤都需要进行validation。 例如,当你调用一个方法时,它需要检查目标是否实际上是方法的声明者的实例,你是否有正确数量的参数,每个参数是否是正确的类型等。

绝对没有内联或其他性能技巧的可能性。

如果您按名称查找类型或方法,那么最多只需要进行简单的地图查找 – 每次执行时都会执行,而不是在JIT时执行一次。

基本上还有很多事要做。 然而,reflection已经变得比以前快得多……如果你发现它太慢了,你可能会过度使用它。

作为Jon Skeet上面答案的附录(我需要更多的声誉才能发表评论。):

reflection取决于可用的CPU资源; 如果你的应用程序问题很慢,reflection将无法解决任何问题,只是让它变慢。

就像Java本身一样,反思也不再缓慢 – 它更像是一个古老的谣言;)

调用方法时,您需要知道是否使用有效参数,有效对象,返回类型以及要执行的字节码。 当在代码中指定了确切的方法时,java可以快速计算出这些东西并继续实际执行该方法。

当你用reflection做这件事时,你知道的要少得多。 由于未在代码中指定要调用的方法,因此无法事先完成此操作,并且VM必须在运行时执行更复杂且处理器密集的操作。

多态方法调用可以介于这两个极端之间。 您不知道在运行时调用什么方法,但至少可以确定方法的名称,参数和返回类型。 您对执行什么方法的了解越多,Java就越可以避免在运行时执行。

这certificatereflection速度较慢 ,但并不是说实际上“慢”。 如果您需要reflection或多态方法,请使用它们,并保存对以后“慢”的判断。

如果以适当的方式使用它,它就不会那么慢。 例如,我用它来扫描模型类中的所有属性,它工作得很好。

在其他情况下,例如检查目标是否具有相同的类型或签名,它绝对是慢的。

事件有时很慢,但对开箱即用的实施很重要……:D。