Как создать переменную класса, созданного с помощью javassist

Я создал класс pojo во время выполнения, используя javassist. Я пытаюсь преобразовать XML-файл в java-объект, используя созданный мной pojo, используя jackson mapper, как показано ниже,

//test.proper.MyRuntimeClass is the Pojo I created using javassist.
CtClass ctClass = classPool.getCtClass("test.proper.MyRuntimeClass");

mapper.readValue(<InputStream>, Class.forName(ctClass.getName()));

Я могу разобрать файл XML, но не могу присвоить переменную типа MyRuntimeClass вышеуказанной строке.

Я хочу что-то вроде этого.

test.proper.MyRuntimeClass myClass = mapper.readValue(<InputStream>, Class.forName(ctClass.getName()));

Пожалуйста, дайте мне знать, как этого добиться. Заранее спасибо.


person SureshMoorthi    schedule 21.06.2016    source источник
comment
Имхо, этим вы усложняете себе жизнь. В вашем классе времени выполнения не будет методов, и ничто в его классовой принадлежности не будет иметь ценности. Я думаю, было бы проще, если бы вы просто использовали коллекцию типов данных, возможно, Map. Можете ли вы объяснить, почему вы не хотите этого делать?   -  person ControlAltDel    schedule 21.06.2016


Ответы (2)


Вы не можете использовать класс в «обычном» коде Java. Вам нужно скомпилировать «обычный» java-код, чтобы компилировать компилятору нужен весь байт-код классов, которые он использует.

Но это можно обойти:

  • Создайте интерфейс, который реализует созданный javassist класс, и используйте этот тип для переменной "myClass"
  • Сгенерируйте код, использующий MyRuntimeClass, с помощью javasisst.
  • Используйте объект как тип «myClass» и отражение для доступа к методам/свойствам на нем.

На мой взгляд, создание интерфейса — это самый простой для написания/понятия/поддержки подход.

person k5_    schedule 21.06.2016

Сначала вам нужно преобразовать CtClass в класс. Затем передайте его в Mapper как класс.

Class MyRuntimeClass = ctClass.toClass();
mapper.readValue(<InputStream>, MyRuntimeClass);

Более подробная информация здесь - Почему я должен вызывать .toClass() после изменения тела метода с помощью Javassist?

person Shankar P S    schedule 21.06.2016