Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Sun обеспечивает API по имени CodeModel для генерации исходных файлов Java с помощью API. Это не самая легкая вещь получить информацию о, но это там, и это работает чрезвычайно хорошо.
самый легкий способ овладеть им как часть JAXB 2 RI - генератор схемы к Java XJC использует CodeModel для генерации его источника Java, и это - часть банок XJC. Можно использовать его только для CodeModel.
Захват это от http://codemodel.java.net/
Я делал его сам для ложного инструмента генератора. Это - очень простая задача, даже если необходимо следовать за Sun, форматирующим инструкции. Я держал пари, что Вы закончите код, который делает это быстрее затем, Вы нашли что-то, что соответствует Вашей цели в Интернете.
Вы в основном обрисовали в общих чертах API сами. Просто заполните его фактическим кодом теперь!
Не знайте о библиотеке, но универсальный движок шаблонов мог бы быть всем, в чем Вы нуждаетесь. Существуют набор их , у меня лично был хороший опыт с FreeMarker
Если Вам ДЕЙСТВИТЕЛЬНО нужен источник, я не знаю ни о чем, что генерирует источник. Можно однако использовать ASM или CGLIB для прямого создания .class файлов.
Вы смогли генерировать источник от них, но я только использовал их для генерации байт-кода.
СТРУЯ Eclipse проект может использоваться, чтобы сделать исходное поколение. Я не думаю, что это - API, точно похож на тот, который Вы описали, но каждый раз, когда я услышал о проекте, делающем исходное поколение Java, они использовали СТРУЮ или инструмент собственной разработки.
Другой альтернативой является JDT's Eclipse AST, который хорош, если необходимо переписать произвольный исходный код Java, а не просто генерировать исходный код. (и я полагаю, что это может использоваться независимо от затмения).
Решение нашло с 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();
}
}
Решение нашло с 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;
}
}
Также существует StringTemplate . Он разработан автором ANTLR и довольно мощный.