繁体   English   中英

将字段添加到java.lang.Object

[英]Add a field to java.lang.Object

我在Object类中添加了一个字段,如:

class Object {
   ...

   private Object _objInfo;
}

我更改了java.lang.Object的源代码并重新编译了OpenJDK 6.当VM启动时,我收到以下异常:

Error occurred during initialization of VM
    java.lang.IllegalStateException
    at java.lang.Throwable.initCause(Throwable.java:337)
    at java.lang.ExceptionInInitializerError.<init>(ExceptionInInitializerError.java:79)

当我定义自己的Object类并将其添加到bootclasspath时会出现同样的问题,如:

java -Xbootclasspath/p:<path to my Object class>

谢谢,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的修改导致异常,当JVM尝试创建Exception对象(它是Object的子类)时,它会进入递归循环并尝试在同一个Exception对象上多次调用initCause()。

为什么要修改Object的定义?

显然,本机代码中仍有许多地方存在字段偏移硬连线。 修改一些类,比如Thread ,搞砸了。 如果您更改了Object ,则会将它们全部搞砸。

我怀疑JVM的实现中有一些东西假定了Object的大小。 你已经把它做得更大,以致代码失败了。

因为这是JVM实现者从未考虑过的错误,所以错误处理会中断。

答案是:如果不做更多工作,就无法修改Object。

您最好使用要放入Object的此字段创建一个类X,并使您的类继承自X.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM