Можем ли мы добавить непримитивное поле в существующий класс, используя javassist? - PullRequest
7 голосов
/ 19 февраля 2012

Я новичок в Javassist, и я уже прочитал некоторые учебные пособия, связанные с ним.

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

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

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

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

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

1 Ответ

8 голосов
/ 19 февраля 2012

Да, вы можете добавлять не примитивные поля.Вам просто нужно получить дескриптор класса для поля, обычно через 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);
...