簡體   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