向java.lang.Object添加一个字段
我在Object
类中添加了一个字段,如:
class Object { ... private Object _objInfo; }
我更改了java.lang.Object
的源代码并重新编译了OpenJDK 6.当VM启动时,我收到以下exception:
Error occurred during initialization of VM java.lang.IllegalStateException at java.lang.Throwable.initCause(Throwable.java:337) at java.lang.ExceptionInInitializerError.(ExceptionInInitializerError.java:79)
当我定义自己的Object类并将其添加到bootclasspath时会出现同样的问题,如:
java -Xbootclasspath/p:
谢谢,Horatiu
不要修改Object
。 不要修改java.lang
任何内容。 我不知道它是否在技术上是可行的,但它绝对是一个非常糟糕的主意,并且基本上打破了Java平台(“ 问 : Object.equals()
的合同是什么? 答 :这取决于对JVM的自定义修改让它做……“) – 你将无法完成任何事情。
想想你正在做什么 – 你将这个类(和可能的行为)添加到每个对象。 ClassLoaders,Strings,Threads,InputStreams,Throwables,XMLGregorianCalendar, 一切 。 这几乎肯定不是你想要的。
相反,另一种方法是将您的修改添加到抽象类AppnameSuperObject
,并为您真正想要添加此行为的类扩展它。
另一方面,如果您真的想为所有对象执行此类操作以进行某种日志记录/分析/等工作,请查看使用面向方面的编程以在运行时将额外字段编织到类上 。
在java.lang.Throwable.initCause(Throwable.java:337)上的java java.lang.IllegalStateException初始化期间发生错误在java.lang.ExceptionInInitializerError。(ExceptionInInitializerError.java:79)
如果多次调用initCause()
则initCause()
java.lang.IllegalStateException
。 听起来像是对Object的修改导致exception,当JVM尝试创建Exception对象(它是Object的子类)时,它会进入递归循环并尝试在同一个Exception对象上多次调用initCause()。
为什么要修改Object的定义?
显然,本机代码中仍有许多地方存在字段偏移硬连线。 修改一些类,比如Thread
,搞砸了。 如果您更改了Object
,则会将它们全部搞砸。
我怀疑JVM的实现中有一些东西假定了Object的大小。 你已经把它变大了,所以代码失败了。
因为这是JVM实现者从未考虑过的错误,所以error handling会中断。
答案是:如果不做更多工作,就无法修改Object。
您最好使用要放入Object的此字段创建一个类X,并使您的类inheritance自X.