Добавить field to java.lang.Object

Я добавил поле в класс 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>

Спасибо, Горациу

9
задан vektor 16 July 2012 в 08:39
поделиться

4 ответа

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

Подумайте, что вы делаете - вы добавляете этот класс (и возможное поведение) к каждому объекту. Загрузчики классов, строки, потоки, потоки ввода, метательные объекты, XMLGregorianCalendar, все . Это почти наверняка не то, что вы намеревались сделать.

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


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

9
ответ дан 4 December 2019 в 11:39
поделиться

По-видимому, в машинном коде все еще есть места, где смещения полей жестко запрограммированы. Изменение некоторых классов, таких как Thread , может испортить это. Если вы измените объект , вы все испортите.

3
ответ дан 4 December 2019 в 11:39
поделиться

Ошибка при инициализации виртуальной машины 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.

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

5
ответ дан 4 December 2019 в 11:39
поделиться

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

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

Ответ: вы не можете изменить Object, не проделав еще много работы.

1
ответ дан 4 December 2019 в 11:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: