[英]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.