Java API для генерации [закрытых] исходных файлов Java

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

124
задан 12 revs, 4 users 86% 23 May 2017 в 11:55
поделиться

9 ответов

Sun обеспечивает API по имени CodeModel для генерации исходных файлов Java с помощью API. Это не самая легкая вещь получить информацию о, но это там, и это работает чрезвычайно хорошо.

самый легкий способ овладеть им как часть JAXB 2 RI - генератор схемы к Java XJC использует CodeModel для генерации его источника Java, и это - часть банок XJC. Можно использовать его только для CodeModel.

Захват это от http://codemodel.java.net/

69
ответ дан 24 November 2019 в 01:08
поделиться

Я делал его сам для ложного инструмента генератора. Это - очень простая задача, даже если необходимо следовать за Sun, форматирующим инструкции. Я держал пари, что Вы закончите код, который делает это быстрее затем, Вы нашли что-то, что соответствует Вашей цели в Интернете.

Вы в основном обрисовали в общих чертах API сами. Просто заполните его фактическим кодом теперь!

1
ответ дан 24 November 2019 в 01:08
поделиться

Не знайте о библиотеке, но универсальный движок шаблонов мог бы быть всем, в чем Вы нуждаетесь. Существуют набор их , у меня лично был хороший опыт с FreeMarker

3
ответ дан 24 November 2019 в 01:08
поделиться

Если Вам ДЕЙСТВИТЕЛЬНО нужен источник, я не знаю ни о чем, что генерирует источник. Можно однако использовать ASM или CGLIB для прямого создания .class файлов.

Вы смогли генерировать источник от них, но я только использовал их для генерации байт-кода.

1
ответ дан 24 November 2019 в 01:08
поделиться

СТРУЯ Eclipse проект может использоваться, чтобы сделать исходное поколение. Я не думаю, что это - API, точно похож на тот, который Вы описали, но каждый раз, когда я услышал о проекте, делающем исходное поколение Java, они использовали СТРУЮ или инструмент собственной разработки.

4
ответ дан 24 November 2019 в 01:08
поделиться

Другой альтернативой является JDT's Eclipse AST, который хорош, если необходимо переписать произвольный исходный код Java, а не просто генерировать исходный код. (и я полагаю, что это может использоваться независимо от затмения).

9
ответ дан 24 November 2019 в 01:08
поделиться

Решение нашло с AST
JDT's Eclipse Спасибо, Giles.

, Например, с этим кодом:

AST ast = AST.newAST(AST.JLS3);
CompilationUnit cu = ast.newCompilationUnit();

PackageDeclaration p1 = ast.newPackageDeclaration();
p1.setName(ast.newSimpleName("foo"));
cu.setPackage(p1);

ImportDeclaration id = ast.newImportDeclaration();
id.setName(ast.newName(new String[] { "java", "util", "Set" }));
cu.imports().add(id);

TypeDeclaration td = ast.newTypeDeclaration();
td.setName(ast.newSimpleName("Foo"));
TypeParameter tp = ast.newTypeParameter();
tp.setName(ast.newSimpleName("X"));
td.typeParameters().add(tp);
cu.types().add(td);

MethodDeclaration md = ast.newMethodDeclaration();
td.bodyDeclarations().add(md);

Block block = ast.newBlock();
md.setBody(block);

MethodInvocation mi = ast.newMethodInvocation();
mi.setName(ast.newSimpleName("x"));

ExpressionStatement e = ast.newExpressionStatement(mi);
block.statements().add(e);

System.out.println(cu);

я могу получить этот вывод:

package foo;
import java.util.Set;
class Foo<X> {
  void MISSING(){
    x();
  }
}
27
ответ дан 24 November 2019 в 01:08
поделиться

Решение нашло с CodeModel
Спасибо, skaffman.

, Например, с этим кодом:

JCodeModel cm = new JCodeModel();
JDefinedClass dc = cm._class("foo.Bar");
JMethod m = dc.method(0, int.class, "foo");
m.body()._return(JExpr.lit(5));

File file = new File("./target/classes");
file.mkdirs();
cm.build(file);

я могу получить этот вывод:

package foo;
public class Bar {
    int foo() {
        return  5;
    }
}
45
ответ дан 24 November 2019 в 01:08
поделиться

Также существует StringTemplate . Он разработан автором ANTLR и довольно мощный.

1
ответ дан 24 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: