Добавить поле в java.lang.Object - PullRequest
9 голосов
/ 12 августа 2010

Я добавил поле в Object класс, как в:

class Object {
   ...

   private Object _objInfo;
}

Я изменил исходный код java.lang.Object и перекомпилировал OpenJDK 6. Я получаю следующее исключение при загрузке виртуальной машины:

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

Ответы [ 5 ]

9 голосов
/ 12 августа 2010

Не изменять Object. Не изменяйте ничего в java.lang. Я не знаю, технически ли это возможно, но это определенно исключительно плохая идея, и в основном нарушает платформу Java (" Q : что такое контракт Object.equals()? A : Это зависит от того, какие пользовательские модификации JVM делают это ... ") - вы ничего не сможете сделать.

Подумайте о том, что вы делаете - вы добавляете этот класс (и возможное поведение) к каждому объекту. ClassLoaders, Strings, Threads, InputStreams, Throwables, XMLGregorianCalendar, все . Это почти наверняка не то, что вы хотели.

Вместо этого альтернативным подходом будет добавление ваших модификаций в абстрактный класс AppnameSuperObject и расширение его для классов, к которым вы действительно хотите добавить это поведение.


С другой стороны, если вы действительно хотите сделать это для всех объектов для какой-либо работы по протоколированию / профилированию / и т. Д., Посмотрите на использование аспектно-ориентированного программирования до weave дополнительные поля на классы во время выполнения .

5 голосов
/ 12 августа 2010

Произошла ошибка во время инициализации VM java.lang.IllegalStateException в java.lang.Throwable.initCause (Throwable.java:337) в java.lang.ExceptionInInitializerError. (ExceptionInInitializerError.java:79)

java.lang.IllegalStateException выбрасывается, если initCause() вызывается более одного раза. Похоже, ваша модификация Object вызывает исключение, и когда JVM пытается создать объект Exception (который является подклассом Object), он попадает в рекурсивный цикл и пытается вызвать initCause () более одного раза для одного и того же объекта Exception.

Почему вы хотите изменить определение объекта?

3 голосов
/ 12 августа 2010

Очевидно, в нативном коде все еще есть ряд мест, где смещения полей зашиты. Модификация некоторых классов, таких как Thread, испортит это. Если вы измените Object, вы все испортите.

1 голос
/ 12 августа 2010

Я подозреваю, что внутри реализации JVM есть что-то, что принимает размер Object. Вы сделали его больше, чтобы код не работал.

Поскольку это ошибка, которую разработчики JVM никогда не рассматривали, обработка ошибок прерывается.

Ответ: Вы не можете изменить Объект, не выполнив намного больше работы.

0 голосов
/ 28 декабря 2010

Вам лучше создать класс X с этим полем, которое вы хотите поместить в Object, и заставить ваши классы наследоваться от X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...