当前位置: 首页 > 面试题库 >

有什么方法可以进一步优化Java反射方法调用?

赵同
2023-03-14
问题内容

我想知道是否可以实现任何其他优化来提高Java中反射调用的速度。并不是说性能会令人望而却步,而是当我想到我正在编写的某个库中的某些代码是在某个地方的紧密循环中实现时,我会大为惊讶。

考虑一种实用方法来进行反射性调用:

public static Object invoke(Object targetObject, String methodName, Object[] arguments, Class<?>[] signature)

基本操作是

return method.invoke(targetObject, arguments);

作为性能优化,我使用目标对象的类,方法名称和签名(其代码可能需要一些改进)的哈希值来缓存该方法,但是除此之外,我还能做其他事情吗?我听说过一些有关
InvokeDynamic 早期实现的 参考
,这听起来很有希望,但我只是假设它们可能尚不适用,因此我放弃了自己的字节码操作,因为我想使实用程序保持简单(但快速)。

干杯。


问题答案:

以下注释与Sun的实现有关,特别是与OpenJDK 6有关。您的工作量可能会因其他Java平台实现而异。

java.lang.Class本身会进行一些缓存,因此实​​现自己的缓存可能不会带来很多改善。使用和不使用手动缓存进行计时测试。

实际的调用机制也已优化。使用JNI调用反射方法的前15次运行(默认情况下);之后,将生成字节码,并且调用该反射方法的行为与直接在Java代码中调用该方法的行为相同。



 类似资料:
  • 问题内容: 我有一个使用XML和反射将 s 返回到另一个类的类。 通常,这些对象是外部对象的子字段,但有时我想即时生成它。我已经尝试过类似的方法,但无济于事。我相信这是因为Java不允许你访问进行反射的方法。 如果提供的方法失败,则失败。我可以通过制作方法来解决它,或者制作另一个类来派生它。 长话短说,我只是想知道是否存在一种通过反射访问方法的方法。 问题答案: 你可以使用反射调用私有方法。修改已

  • 问题内容: 我不应该能够调用实例化对象的私有方法。我想知道为什么下面的代码有效。 我知道可以从类中访问私有方法。但是,如果类中的方法实例化了同一类的对象,则作用域规则是否不适用于该实例化的对象? 如本例所示,像main这样的静态方法可以访问类的非静态成员吗​​? 问题答案: 您的方法是的方法,因此可以调用的私有方法。 只是因为它是一个方法并不妨碍它表现得像为目的的方法,等等。 只是阻止的方法 等

  • 问题内容: 我有几个实现某些接口的类。该接口有一个约定,某些方法应该同步,有些方法应该不同步,我想通过单元测试对所有实现进行验证。这些方法应使用synced关键字或将其锁定-与SynchronizedCollection()包装器非常相似。这意味着我应该能够从外部观察它。 如果我有一个调用iterator()的线程来继续Collections.synchronizedCollection()的示例

  • 因此,我有一个场景,我有一个机会表,其中有客户参考和客户ID。和对ProjectManager的表有引用的Customer表。现在,我有了opportunityId,使用该id我需要获取项目经理的信息。下面是我的工作代码, 现在,我的一个问题是,这两个查询对数据库进行了两次访问,这就把我带到了问题的主要目的,如何优化它,使所有这些都能在一次访问中完成,如果你们能在这段代码中找到任何其他问题,那就太

  • 材料设计非常强调“纸张”的隐喻。要做到这一点,阴影是必不可少的。由于材料设计是一种理念,而不是API(尽管它内置在L中),因此应该在任何地方(Windows窗体、HTML/CSS等)进行设计。如何在Android API 14到20中做到这一点? 请注意,对于圆形和其他非方形形状,预制PNG实际上并不实用。

  • 问题内容: 我需要使用反射调用类的setter方法,并且代码如下: 的是一个以及设置器方法如下: 运行此代码时,将引发A ,但是将setter方法参数类型更改为from时,将执行正常。有没有一种方法可以将setter方法的参数保持为超级类型,并且在从类中获取方法时仍无需手动指定参数的类型即可使用反射? 问题答案: 与其他答案相反,有一个非常简单的解决方案。请参阅。它为您提供了一种执行任意反射代码的