#java #javassist
#java #javassist
Вопрос:
Я пытаюсь добавить поле в класс. Я попробовал приведенные ниже подходы для добавления поля с использованием Javassist. Я пытаюсь получить поле, используя отражение, но оно выдает ошибку java.lang.NoSuchFieldException
.
Подход 1
ClassPool classPool = ClassPool.getDefault();
CtClass clazz = classPool.get("com.mypack.MyClass");
CtField field = new CtField(CtClass.longType, "myNewField", clazz);
field.setModifiers(Modifier.PUBLIC);
clazz.addField(field, javassist.CtField.Initializer.constant(10L));
Подход 2
ClassPool classPool = ClassPool.getDefault();
CtClass clazz = classPool.get("com.mypack.MyClass");
CtField field = CtField.make("public long myNewField = 10;", clazz);
clazz.addField(field);
Подход 3
ClassPool classPool = ClassPool.getDefault();
CtClass clazz = classPool.get("com.mypack.MyClass");
ClassFile cf = clazz.getClassFile();
FieldInfo f = new FieldInfo(cf.getConstPool(), "myNewField", "I");
f.setAccessFlags(AccessFlag.PUBLIC);
cf.addField(f);
Извлечение с использованием отражения
Field myField = MyClass.class.getDeclaredField("myNewField");
System.out.println("----- " serField.get(null));
Может кто-нибудь сказать мне, что я делаю неправильно или если я чего-то не хватает.
Спасибо.
Комментарии:
1. Вы конкретно хотите использовать Java,
getDeclaredField
а неCtClass.getDeclaredField
нет? Не уверен, что вы можете это сделать — возможно, вы захотите просмотреть javassist.org/tutorial/tutorial.html#load .2. На самом деле нет. Все, что я пытаюсь проверить, было ли добавлено поле с указанным значением. Я не смог найти поле с помощью декомпилятора (jd-gui или в IntelliJ). Итак, я подумал о том, чтобы сделать это программно.
3. Вы пишете измененный файл класса? Загружаетесь ли вы с помощью загрузчика классов javassist (или эквивалентного)?
4. Ааа .. Это верно. В этом и заключалась проблема. Я не писал обновленный файл класса. Если вы можете переместить свой комментарий в качестве ответа, я приму его как ответ. Спасибо.