Я добавил поле в класс 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>
Спасибо, Горациу
Не изменять Объект
. Ничего не изменяйте в java.lang
. Я не знаю, возможно ли это технически, но это определенно исключительно плохая идея и в основном ломает платформу Java (" Q : Каков контракт Object.equals ()
? A : Это зависит от того, что делают пользовательские модификации JVM ... ") - вы ничего не сможете сделать.
Подумайте, что вы делаете - вы добавляете этот класс (и возможное поведение) к каждому объекту. Загрузчики классов, строки, потоки, потоки ввода, метательные объекты, XMLGregorianCalendar, все . Это почти наверняка не то, что вы намеревались сделать.
Вместо этого альтернативным подходом было бы добавление ваших изменений в абстрактный класс AppnameSuperObject
и расширение его для классов, в которые вы действительно хотите добавить это поведение.
С другой стороны, если вы действительно хотите сделать это для всех объектов для какой-либо работы по ведению журнала / профилированию и т. Д., Посмотрите на использование аспектно-ориентированного программирования с до переплетения дополнительные поля в классы во время выполнения .
По-видимому, в машинном коде все еще есть места, где смещения полей жестко запрограммированы. Изменение некоторых классов, таких как Thread
, может испортить это. Если вы измените объект
, вы все испортите.
Ошибка при инициализации виртуальной машины 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.
Почему вы хотите изменить определение объекта?
Я подозреваю, что внутри реализации JVM есть что-то, что предполагает размер Object. Вы сделали его больше, поэтому код не работает.
Поскольку это ошибка, которую разработчики JVM никогда не рассматривали, обработка ошибок прекращается.
Ответ: вы не можете изменить Object, не проделав еще много работы.