2012-02-19 6 views
6

Sono un novizio di Javassist, e ho già letto alcuni tutorial relativi ad esso.Possiamo aggiungere un campo non primitivo a una classe esistente usando javassist?

Perché ho bisogno di eseguire un'iniezione bytecode in ciascun metodo prima di entrare o prima dell'uscita del metodo, e ottenere alcune statistiche da questo.

attraverso il tutorial javassit on-line, trovo che siamo in grado di fare un nuovo campo a una classe esistente:

CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(CtClass.intType, "z", point); 
point.addField(f); 

Ma il tipo di CtField contiene solo tipo primitivo per difetto, siamo in grado di aggiungere un nuovo campo il cui tipo non è primitivo, ad esempio ArrayList?

Se riesco ad aggiungere il nuovo campo ArrayList alla classe esistente, poiché la classe non importa java.util.ArrayList, causerà l'errore di compilazione?

risposta

6

Sì, è possibile aggiungere campi non primitivi. Hai solo bisogno di ottenere un handle per la classe per il campo, normalmente tramite ClassPool. Si noti che è necessario il nome completo della classe che si desidera utilizzare:

CtClass arrListClazz = ClassPool.getDefault().get("java.util.ArrayList"); 
CtClass point = ClassPool.getDefault().get("Point"); 
CtField f = new CtField(arrListClazz, "someList", point); 
point.addField(f); 
+0

Grazie, il codice di cui sopra significa che si aggiunge la nuova someList membro ArrayList alla classe punto, ma nella classe punto non l'abbiamo fatto' t importare java.util.ArrayList, causerà l'errore di compilazione? – LifeOnCodes

+0

Bene, l'aggiunta del *** bytec *** che rappresenta un campo java.util.ArrayList, non una stringa di lingua inglese effettiva. Le istruzioni di importazione sono solo direttive del compilatore che non compaiono nel file di classe compilato. Che è, a proposito, perché è necessario utilizzare un nome completo (FQN) durante la ricerca di classi in ClassPool. – Perception

+0

Grazie mille, vedo. Penso che dovrei passare un po 'di tempo a studiare il bytecode. Un'altra domanda, si spera che tu possa aiutarmi, è possibile che il memeber della lista sia un tipo generico, come ArrayList someList? – LifeOnCodes

Problemi correlati