【问题标题】:Modify field in class during runtime - java在运行时修改类中的字段 - java
【发布时间】:2017-09-03 11:08:51
【问题描述】:

我的问题是,是否可以将属性甚至方法注入到已经“类加载”的类中。我已经注意到,在 java 中动态添加属性并不是很简单,每个人都说你应该使用 Map (add property for a object dynamicly)。

有没有更好和“更干净”的方法来在运行时更改类。我读过一些关于 ASM 的文章,但我不知道 ASM 使用的访问者模式是否是最佳的工作方式。

如果ASM 是解决此问题的最佳方法,那么除了 ASM 网站 (http://download.forge.objectweb.org/asm/asm4-guide.pdf) 上提供的文档之外,是否还有其他文档

【问题讨论】:

  • 这个的用例是什么?
  • spring & co 给我留下了深刻的印象,我想为什么不尝试编写相同的代码,只是为了更多地了解 java.reflection 以及可能在如此出色的框架背后的过程。简短:我想学习新事物
  • 据我记得,ZeroTurnaround 的某个人(他制作了 JRebel)向现有类添加字段和方法真的很难,并且需要一些变通方法,例如将整个类实际替换为新类,然后更新类的所有链接。试图在网上找到谈话,如果我这样做会更新。
  • 为了清楚起见,更新现有字段并不难,但我认为这不是您要问的?
  • 找到了话题:vimeo.com/138954121“JRebel 在幕后 - 这怎么可能? - Simon Maple”

标签: java class dynamic reflection


【解决方案1】:

一旦 JVM 加载了一个类,就无法修改它。

你最好的办法是修改类,然后加载一个新的副本......在不同的类加载器中。您最终将得到该类的两个版本(具有不同的运行时类型!)。该类的第一个版本的任何实例都不会有新的字段、方法等。

我的建议......不要这样做。想想另一种方法来实现你在这里实际尝试做的事情。或者,如果动态修改类对您的应用程序至关重要,请考虑使用更动态的语言。

【讨论】:

  • 感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多