【问题标题】:Creating fields dynamically java动态创建字段java
【发布时间】:2013-03-03 13:33:07
【问题描述】:

我想知道他们是否有任何方法可以在运行时使用反射或相关 API 为类动态创建静态字段。如果需要,如果有人可以告诉我适当的步骤,我可以使用 java 本机接口来完成此任务。我不想使用任何数据结构,例如哈希映射,因为我这样做完全是为了好玩。请不要建议使用地图,因为我没有将其用于任何实际程序,这是完全理论上的情况。谢谢。

【问题讨论】:

  • static 字段不属于class 定义,不属于任何给定的类类型的运行时对象吗?反射是一种运行时机制;我怀疑你的提议是可能的。我能想到的最接近的东西是单例,因为单例总是引用同一个运行时实例。
  • 但可以动态地向类中添加新字段。
  • 我不知道怎么做。类是一种编译时机制。
  • 编译器将static final 字段作为硬编码常量拉入引用的类中,因此如果您的字段是static final,答案是响亮的
  • 不是最终的,只是静态的

标签: java dynamic reflection


【解决方案1】:

您可以在类加载期间执行此操作using bytecode manipulation

虽然这是一个非常复杂的解决方案,所以我会考虑其他选择。

拥有一个在编译时未知的新字段也没有太大帮助,因为您无法针对它编译任何东西。如果你打算使用反射来访问它,你不妨一开始就使用 Map。

【讨论】:

  • 只要有足够的时间、金钱和程序员资源,一切皆有可能。
  • 是的,但是否可以通过合理的努力和编程来完成
  • 是的,看看字节码操作库。但是,为什么?您将如何访问这些字段?您不能针对编译器不知道的字段进行编译。
  • reasonable:在你的情况下,我对此表示怀疑。您可能希望动态添加代码/功能,但在运行时添加字段会破坏静态类型编译语言的目的。也许您想使用 Jython、Groovy 或 JRuby 之类的。
  • 对于某一类用例,您可以查看 AOP / AspectJ。它基本上是一种在 Java 中进行某种元编程的结构化方式。 (包括引入全新的成员。)它至少比直接字节码操作稍微不那么疯狂!
【解决方案2】:

Java 不支持以特别好的或有效的方式进行元编程或运行时编程。

您可以使用装饰器模式。您可以将要添加静态字段的对象传递到包装器对象中。此包装器将具有静态字段,并且对包装器对象的调用将与被包装对象相关。

如果您可以提供有关您正在寻找的功能的更多详细信息,我可以尝试提供更好的解决方案。如果您绝对需要以这种方式完成,您最好寻找另一种支持运行时编程的语言。

【讨论】:

  • 我只是想看看是否可以将字段添加到对象/类中只是为了这样做,我喜欢这样做是为了好玩
  • 可以理解。在其他一些语言中它是一个有用的工具。
猜你喜欢
  • 2016-07-28
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
相关资源
最近更新 更多