Генерация динамического кода Java с поддержкой обобщений - PullRequest
6 голосов
/ 30 августа 2010

Существует ли какой-либо инструмент, который обеспечивает генерацию динамического кода Java и также поддерживает дженерики?

Например, Javassist - это тот инструмент, который мне нужен, но он не поддерживает дженерики.

Я написал небольшую библиотеку, в которой используется API компилятора Java 6, однако, насколько мне известно, это зависит от JDK.Есть ли способ указать другой компилятор?Или поставлять вместе с моим приложением только те части, которые мне нужны для вызова с помощью Java Compiler API?

Ответы [ 4 ]

4 голосов
/ 01 августа 2012

Кажется, вы можете манипулировать и читать общую информацию с помощью Javaassist. См

http://www.mail-archive.com/jboss-user@lists.jboss.org/msg101222.html

[jboss-user] [Javassist user questions] - Re: Изменение общей информации о методах с использованием Javassist SimonRinguette Четверг, 20 декабря 2007 г. 12:22:14 -0800

Я продолжил читать о том, как это реализовано компилятором и наконец-то узнал ответ, который искал.

Вы можете сделать это с помощью javaassist. Ключевой класс javassist.bytecode.SignatureAttribute.

Из CtMethod я получил метод, в котором я добавляю атрибут Signature. Вы можете сделать это с чем-то вроде:

CtMethod method = ....
   MethodInfo methodInfo = method.getMethodInfo();
   SignatureAttribute signatureAttribute = new 
SignatureAttribute(methodInfo.getConstPool(),
   "()Ljava/util/List<Ljava/lang/String;>;");
   methodInfo.addAttribute(signatureAttribute);

Если вы больше заинтересованы в чтении подписи с генериками внутри, вы можно использовать методInfo.getAttribute (SignatureAttribute.tag).

Надеюсь, это помогло.

2 голосов
/ 30 августа 2010

Если вам удобно писать байт-код, тогда ASM - неплохая библиотека для такого рода вещей.Это позволит вам генерировать файл класса на лету, не беспокоясь о мелочах формата файла классов.Затем вы можете использовать загрузчик классов, чтобы динамически загрузить его в ваше приложение.

0 голосов
/ 25 июля 2018

На самом деле, javaassist может обрабатывать генерики, используя SignatureAttribute.

SignatureAttribute.Type retType = new SignatureAttribute.BaseType(Void.TYPE.getName());
SignatureAttribute.Type[] argType = getArgType();
SignatureAttribute.MethodSignature signature = new SignatureAttribute.MethodSignature(null, argType, retType, null);
method.setGenericSignature(signature.encode());

Этот проект имеет много очень хороших примеров. Хоп они полезны.

0 голосов
/ 30 августа 2010

Если я правильно помню, достаточно иметь tools.jar в пути к классам, чтобы использовать компилятор Java во время выполнения.

...