向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.