2010-08-11 12 views
9

ho aggiunto un campo per Object di classe, come in:Aggiungere un campo alla java.lang.Object

class Object { 
    ... 

    private Object _objInfo; 
} 

ho cambiato java.lang.Object s' codice sorgente e ricompilato OpenJDK 6. ottengo la seguente eccezione quando la VM stivali:

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) 

Lo stesso problema si verifica quando definisco la mia classe Object e anteposto a bootclasspath, come in:

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

Grazie, Horatiu

+0

Perché non si crea una classe per mettere _objInfo? –

+2

Non penso che in realtà tu faccia una domanda da nessuna parte. –

+4

@justin, è abbastanza chiaro cosa vorrebbe che noi lo aiutassimo con ... – jjnguy

risposta

4

verificato un errore durante l'inizializzazione di VM java.lang.IllegalStateException a java.lang.Throwable.initCause (Throwable.java:337) a java.lang.ExceptionInInitializerError. (ExceptionInInitializerError.java:79)

Il java.lang.IllegalStateException viene generata se initCause() è chiamato più di una volta. Sembra che la tua modifica di Object stia causando un'eccezione e quando la JVM tenta di creare un oggetto Exception (che è una sottoclasse di Object) entra in un loop ricorsivo e tenta di chiamare initCause() più volte sullo stesso oggetto Exception.

Perché si desidera modificare la definizione dell'oggetto?

+1

Devo conservare alcune informazioni in fase di esecuzione per ogni oggetto utilizzato come blocco. Per questo, ho una mappa globale di hash che mappa un ID oggetto restituito da System.identityHashCode() ad alcune informazioni associate al blocco. Ma questa ricerca è costosa; sarà molto più veloce se avessi un campo in classe Object che possa puntare a informazioni arbitrarie sull'oggetto. –

+0

@HoratiuJula questo è esattamente ciò di cui ho bisogno per il mio Algorithmic Profiler, tranne per il fatto che devo tenere traccia di tutti gli oggetti profilati. Proprio come te, ho iniziato con una mappa indicizzata da 'System.identityHashCode()' solo per trovarla troppo lenta ... – vektor

1

Ho il sospetto che ci sia qualcosa all'interno dell'implementazione della JVM che assume la dimensione dell'oggetto. L'hai ingrandito in modo che il codice non funzioni.

Poiché si tratta di un errore che gli implementatori della JVM non hanno mai preso in considerazione, la gestione degli errori si interrompe.

La risposta: non è possibile modificare l'oggetto senza fare molto più lavoro.

3

Apparentemente, ci sono ancora un certo numero di posti nel codice nativo dove gli offset di campo sono cablati. La modifica di alcune classi, come ad esempio Thread, lo incasina. Se cambi Object, li rovini tutto.

+0

Lo so, in Dalvik VM (usato in Android) ho avuto lo stesso problema ... Ma lì, ho trovato gli offset e li ho ricalcolati. Tuttavia, non so dove offset di campo per Object, String, ecc., Sono hardcoded in openjdk ... –

+1

@Horatiu Jula: sembra che la domanda a cui vuoi veramente rispondere sia ... "Di quali cambiamenti ho bisogno fare alle sorgenti JVM di openjdk 6 se estendo l'ingombro di memoria della classe Object? " Vi avverto che la VM di openjdk è stata probabilmente vittima di alcune ottimizzazioni delle prestazioni molto intense che apporteranno le modifiche necessarie per supportare le modifiche desiderate a Oggetti ottusi e diffusi. – vkraemer

+0

@Horatiu Jula: potrebbe essere necessario apportare modifiche anche a javac. – vkraemer

9

Non modificare Object. Non modificare nulla in java.lang. Non so se sia tecnicamente possibile, ma è decisamente un'idea pessima, e fondamentalmente rompe la piattaforma Java ("Q: Qual è il contratto di Object.equals()? A: Dipende da quali modifiche personalizzate alla JVM fallo fare ... ") - non saresti in grado di fare qualcosa.

Pensa a quello che stai facendo - stai aggiungendo questa classe (e il possibile comportamento) a ogni oggetto. ClassLoaders, Stringhe, Thread, InputStreams, Throwables, XMLGregorianCalendar, tutto. Questo non è quasi certamente ciò che intendevi.

Invece, un approccio alternativo sarebbe di aggiungere le modifiche a una classe astratta AppnameSuperObject, ed estendere questo per le classi che si davvero desidera aggiungere questo comportamento a.


D'altra parte, se davvero si vuole fare questo per tutti gli oggetti di un qualche tipo di registrazione/profilazione/etc tipo di lavoro, guardare con aspect-oriented programming a weave the extra fields onto the classes at runtime.

+0

L'ho provato, non funziona per la classe Object ... –

+2

Oppure, invece di tenere una lezione, potresti provare a rispondere alla domanda dell'OP. C'è questa idea radicale che se non conosci la risposta, non devi pubblicarne una. Prendi invece in considerazione la possibilità di chiedere chiarimenti nei commenti. –

+1

Come già descritto da Ted Neward nel 2001, il percorso di boot esiste, in parte, proprio per questo motivo: essere in grado di modificare le classi java. * (Http://www.tedneward.com/files/Papers/BootClasspath/BootClasspath. pdf) – Confusion

0

È meglio creare una classe X con questo campo che si desidera mettere in oggetto ed effettuare le classi ereditano da X.

Problemi correlati