2010-08-11 14 views
9

he añadido un campo para Object clase, como en:Añadir un campo de java.lang.Object

class Object { 
    ... 

    private Object _objInfo; 
} 

he cambiado java.lang.Object 's código fuente y recompilado OpenJDK 6. Me da la siguiente excepción cuando el VM botas:

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) 

El mismo problema se produce cuando defino mi propia clase de objetos y antepone a bootclasspath, como en:

java -Xbootclasspath/p:<path to my Object class> 

Gracias, Horatiu

+0

¿Por qué no se crea una classe de poner _objInfo? –

+2

No creo que realmente hagas una pregunta en ningún lado. –

+4

@justin, está bastante claro en qué le gustaría que lo ayudemos con ... – jjnguy

Respuesta

4

error ocurrió durante la inicialización de VM java.lang.IllegalStateException en java.lang.Throwable.initCause (Throwable.java:337) en java.lang.ExceptionInInitializerError. (ExceptionInInitializerError.java:79)

El java.lang.IllegalStateException se produce si initCause() se llama más de una vez. Parece que su modificación de Object causa una excepción y cuando la JVM intenta crear un objeto Exception (que es una subclase de Object) entra en un bucle recursivo e intenta llamar a initCause() más de una vez en el mismo objeto Exception.

¿Por qué quiere modificar la definición de objeto?

+1

Tengo que mantener cierta información en tiempo de ejecución para cada objeto utilizado como un candado. Para eso, tengo un mapa hash global que mapea una identificación obj devuelta por System.identityHashCode() a alguna información asociada al bloqueo. Pero esta búsqueda es costosa; será mucho más rápido si tuviera un campo en la clase Objeto que puede apuntar a información arbitraria sobre el objeto. –

+0

@HoratiuJula esto es exactamente lo que necesito para mi Algorithmic Profiler, excepto que necesito hacer un seguimiento de _todos los objetos perfilados. Al igual que usted, comencé con un mapa indexado por 'System.identityHashCode()' solo para encontrarlo demasiado lento ... – vektor

1

Sospecho que hay algo dentro de la implementación de la JVM que asume el tamaño de Object. Lo has hecho más grande para que el código esté fallando.

Como este es un error que los implementadores de JVM nunca tuvieron en cuenta, el manejo de errores se rompe.

La respuesta: no se puede modificar el objeto sin hacer mucho más trabajo.

3

Aparentemente, todavía hay una serie de lugares en el código nativo donde los desplazamientos de campo están cableados. Modificar algunas clases, como Thread, estropear esto. Si cambias Object, las estropeas.

+0

Lo sé, en Dalvik VM (usado en Android) tuve el mismo problema ... Pero allí, encontré las compensaciones y las volví a calcular. Sin embargo, no sé dónde las compensaciones de campo para Objeto, Cadena, etc., están codificadas en openjdk ... –

+1

@Horatiu Jula: parece que la pregunta que realmente quiere responder es ... "¿Qué cambios necesito? hacer a las fuentes OpenJDK 6 JVM si extiendo la huella de memoria de la clase Object? " Le advertiría que es probable que la VM de openjdk haya sido víctima de algunas optimizaciones de rendimiento muy intensas que harán que los cambios que necesita hacer para respaldar sus cambios deseados en obtusos sean obtusos y generalizados. – vkraemer

+0

@Horatiu Jula: es posible que deba hacer modificaciones a javac también. – vkraemer

9

No modifique Object. No modifique nada en java.lang. No sé si es técnicamente posible, pero definitivamente es una idea excepcionalmente mala, y básicamente rompe la plataforma Java ("Q: ¿Cuál es el contrato de Object.equals()? A: Depende de las modificaciones personalizadas de la JVM hazlo ... ") - no podrías hacer nada.

Piensa en lo que estás haciendo: estás agregando esta clase (y comportamiento posible) a cada objeto. ClassLoaders, Strings, Threads, InputStreams, Throwables, XMLGregorianCalendar, todo. Esto es casi seguro que no es lo que pretendías.

En cambio, un enfoque alternativo sería añadir sus modificaciones a una clase abstracta AppnameSuperObject, y extender esto para las clases que realmente desee añadir a este comportamiento.


Por otro lado, si usted realmente quiere hacer esto para todos los objetos de algún tipo de explotación y/o perfiles/etc tipo de trabajo, buscar en el uso aspect-oriented programming a weave the extra fields onto the classes at runtime.

+0

Lo probé, no funciona para la clase Object ... –

+2

O, en lugar de disertar, podría intentar responder la pregunta del OP. Existe la idea radical de que si no sabes la respuesta, no deberías publicar una. En su lugar, considere hacer preguntas aclaratorias en los comentarios. –

+1

Como Ted Neward ya describió en 2001, el bootclasspath existe, en parte, exactamente por este motivo: para poder modificar clases java. * (Http://www.tedneward.com/files/Papers/BootClasspath/BootClasspath). pdf) – Confusion

0

Es mejor crear una X clase con este campo que desea poner en objetos y hacer que sus clases heredan de X.

Cuestiones relacionadas