【问题标题】:Java reflection vs code generationJava 反射与代码生成
【发布时间】:2014-05-19 06:40:37
【问题描述】:

今天我想知道为什么像 `Hibernate 这样的框架在编译/应用程序启动期间使用反射而不是代码生成(例如使用像 BCELASM 这样的库)。

是不是因为历史原因(在编写Hibernate 时,没有这样的库可以允许动态生成字节码)而现在每个人都使用这种方法?

我认为生成代码的方法会比使用反射的方法更快。

【问题讨论】:

  • 反射并没有那么慢,尤其是在 I/O 的上下文中 - 数据库/文件访问将比反射造成的性能下降几个数量级。
  • 是的,你可能是对的。我之所以问这个问题,是因为我对使用反射的决定感到好奇。经过这么多年的 JVM,我相信与 Java 的第一个版本相比,有许多优化可以加快反射速度。

标签: java reflection metaprogramming


【解决方案1】:

没错,Hibernate 可能会从代码生成中受益,尽管利润可能没有你想象的那么大。

  1. 首先,Reflection 在后台使用字节码生成,而且速度不会太慢。
  2. 您不能仅使用字节码生成来做某些事情。例如。反射允许您访问私有字段并调用私有方法,而字节码生成则无法实现(除非您使用certain non-portable hacks)。

【讨论】:

  • 广告。 1 - 你有这方面的任何来源(我的意思是代码生成)?我从来没有真正读过反射是如何在幕后工作的。如果你能指出我的一些文章,我会很高兴。广告。 2 - 正确,值得反思
  • 查看 OpenJDK 中的Reflection sources,尤其是MethodAccessorGenerator.java。简而言之,java.lang.Method 有一个访问器,调用被委托给它。 Method.invoke() 的前 15 次调用是通过 JVM 的本机调用执行的(参见 NativeMethodAccessorImpl.java)。然后,一旦达到sun.reflect.inflationThreshold(默认为15),就会运行字节码生成并将NativeMethodAccessorImpl 替换为动态生成的Java 访问器。
  • 感谢您链接相关来源。
猜你喜欢
  • 2012-05-04
  • 2011-02-07
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多