2012-02-19 12 views
6

Jestem początkującym Javassist, i już przeczytałem kilka tutoriali związanych z tym.Czy możemy dodać nieparzyste pole do istniejącej klasy przy użyciu javassist?

Ponieważ potrzebuję wykonać zastrzyk kodu bajtowego w każdej metodzie, wejdź do lub przed wyjściem z metody i uzyskaj statystyki z tego.

przez samouczek javassit internetowym, uważam, że możemy zrobić nowe pole do istniejącego Klasa:

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

Ale typ CtField zawiera tylko prymitywny typ domyślnie, możemy dodać nowe pole którego typ jest nieprosty, na przykład ArrayList?

Czy mogę dodać nowe pole ArrayList do istniejącej klasy, ponieważ klasa nie importuje java.util.ArrayList, spowoduje błąd kompilacji?

Odpowiedz

6

Tak, można dodać nieparzyste pola. Trzeba tylko uzyskać uchwyt do klasy dla pola, zwykle za pomocą ClassPool. Należy pamiętać, że trzeba będzie w pełni kwalifikowaną nazwę klasy, której chcesz użyć:

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

Dzięki, powyższy kod oznacza, że ​​dodamy nowy jakaśLista członek ArrayList do klasy punkt, ale w klasie punkcie my nie zrobił” t zaimportować java.util.ArrayList, spowoduje to błąd kompilacji? – LifeOnCodes

+0

Cóż, dodawanie *** bajtowego kodu ***, który reprezentuje pole java.util.ArrayList, a nie faktyczny ciąg w języku angielskim. Instrukcje importu są jedynie dyrektywami kompilatora, które nie pojawiają się w skompilowanym pliku klasy. Co jest przy okazji, dlaczego musisz używać w pełni kwalifikowanej nazwy (FQN) podczas wyszukiwania klas w ClassPool. – Perception

+0

Wielkie dzięki, widzę. Myślę, że powinienem poświęcić trochę czasu na studiowanie kodu bajtowego. Jeszcze jedno pytanie, mam nadzieję, że możesz mi pomóc, czy jest możliwe, że memember someList jest typem generycznym, takim jak ArrayList someList? – LifeOnCodes

Powiązane problemy