2012-02-19 4 views
6

Я новичок в Javassist, и я уже прочитал некоторые учебники, связанные с ним.Можно ли добавить не-примитивное поле в существующий класс с помощью javassist?

Потому что мне нужно, чтобы какая-либо инъекция байткода в каждом методе вводилась или до выхода метода, и получайте от нее некоторую статистику.

Через онлайн javassit учебник, я считаю, что мы можем сделать новое поле к существующему классу:

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

Но тип CtField содержит только примитивный тип по умолчанию, мы можем добавить новое поле тип которого не является примитивным, например, ArrayList?

Если я могу добавить новое поле ArrayList в существующий класс, так как класс не импортирует java.util.ArrayList, это вызовет ошибку компиляции?

ответ

6

Да, вы можете добавить не примитивные поля. Вам просто нужно получить дескриптор класса для поля, обычно через ClassPool. Обратите внимание, что вам потребуется полное имя класса, который вы хотите использовать:

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

Спасибо, приведенный выше код означает, что мы добавляем новый someList члена ArrayList к классу точки, но в классе точки мы Ждем» t импортировать java.util.ArrayList, это вызовет ошибку компиляции? – LifeOnCodes

+0

Ну, добавив *** байт-код ***, который представляет поле java.util.ArrayList, а не настоящую строку на английском языке. Операторы импорта - это только директивы компилятора, которые не отображаются в файле скомпилированного класса. Кстати, почему вам нужно использовать полное имя (FQN) при поиске классов в ClassPool. – Perception

+0

Большое спасибо, я вижу. Думаю, я должен потратить некоторое время на изучение байт-кода. Еще один вопрос, надеюсь, вы можете мне помочь, возможно ли, что someList memeber будет общим типом, например ArrayList someList? – LifeOnCodes