Исключение NoSuchFieldException для полей, добавленных с помощью Javassist

#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. Ааа .. Это верно. В этом и заключалась проблема. Я не писал обновленный файл класса. Если вы можете переместить свой комментарий в качестве ответа, я приму его как ответ. Спасибо.