(这个问题类似于我看过的很多问题,但大多数问题对我正在做的事情都不够具体)
背景:
我的程序的目的是让使用我的程序的人轻松制作自定义"插件",然后编译并加载到程序中以供使用(与我的程序中实现的不完整,慢速解析器相比).我的程序允许用户将代码输入到预定义的类中,该类扩展了与我的程序一起打包的编译类.他们将代码输入到文本窗格中,然后我的程序将代码复制到被覆盖的方法中.然后将其保存为.java文件(几乎)为编译器准备好了.该程序运行javac(java编译器),并将保存的.java文件作为输入.
我的问题是,我如何得到它,以便客户端(使用我的编译程序)将这个java文件(扩展我的InterfaceExample)保存在他们的计算机上的任何地方,让我的程序编译它(不说"找不到符号:InterfaceExample" )然后加载它并调用doSomething()方法?
我一直在看Q&A使用的是反射或ClassLoader,几乎描述了如何编译它,但没有一个对我来说足够详细/我完全不理解它们.
可以在本地运行JAR文件.下一步是在另一台PC上运行它.
问题是JRE,JDK或两者是否都需要运行JAR文件?
出于调试原因,我希望能够运行通过控制台输入的代码.例如:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
String str = br.readLine(); //This can return 'a = 5;','b = "Text";' or 'pckg.example.MyClass.run(5);'
if(str == null)
return;
runCode(str); //How would I do this?
}
Run Code Online (Sandbox Code Playgroud) 在这里,我找到了一些很好的例子:
// Prepare source somehow.
String source = "package test; public class Test { static { System.out.println(\"hello\"); } public Test() { System.out.println(\"world\"); } }";
// Save source in .java file.
File root = new File("/java"); // On Windows running on C:\, this is C:\java.
File sourceFile = new File(root, "test/Test.java");
sourceFile.getParentFile().mkdirs();
new FileWriter(sourceFile).append(source).close();
// Compile source file.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
// Load and instantiate compiled class.
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() }); …Run Code Online (Sandbox Code Playgroud) 如何使用注释在编译时编写带有自定义属性的Java内部类?
例如,我想要这个:
@Generate
class Person {
String firstname, lastname;
}
Run Code Online (Sandbox Code Playgroud)
生成:
class Person {
String firstname, lastname;
public static class $Fields {
public static String firstname = "firstname";
public static String lastname = "lastname";
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何编写界面:
@Retention(RetentionPolicy.SOURCE)
public @interface Generate {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我知道我需要做一些AST转换才能让这个神奇.
我也知道项目lombok,但我想通过一个简单的例子知道最不常见的分母,最好是在一个方法中,最好是一个好的编辑器会自动考虑的东西,例如Javac编译器的RetentionPolicy.SOURCE,可以在Intellij IDEA中使用.
项目lombok是一个明智的野兽代码,是一个艰难的起点.
它必须比那更简单,不是吗?
有任何想法吗?
有没有办法让正在运行的Java程序编译Java源代码(作为字符串传递)?
Class newClass = Compiler.compile ("class ABC { void xyz {etc. etc. } }");
Run Code Online (Sandbox Code Playgroud)
理想情况下,传入源代码引用的任何类都将由程序的类加载器解析.
这样的事情存在吗?
我刚刚创建了一个简单的java应用程序,它将为我们的数据库生成实体类.我将保存到本地光盘的那些java类.到目前为止一切正常.
现在我想从我的主应用程序中的那些java类生成一个JAR文件.我知道,我可以操作jar文件,我还读到了在运行时将类添加到jar文件.
但就我而言,我的构建路径中没有类.我需要的是从刚刚创建的java文件创建类文件并将它们放入我的jar文件中.
这可能在我的java应用程序中吗?
我这样做的原因是我们的数据库将一直由许多人扩展,我不想手动将这些字段添加到我的实体.所以我想创建一个从我们的数据库中扫描systables的应用程序,并从这些信息中生成java实体文件.但是现在我需要在生成它们之后在类文件中编译这些java文件并将它们添加到我的最终jar文件中.
感谢您提供有关此问题的任何帮助和/或信息.
许多问候,霍克
我有一个功能:
fun1() {
System.out.print("hello");
}
Run Code Online (Sandbox Code Playgroud)
我想从用户或文件中读取一个字符串,如果"fun1()"出现该字符串,我会调用fun1.
我不想用switch语句来做这个,因为我有很多功能.
有什么方法可以使用字符串调用函数吗?
是否可以在运行时编译和实例化Kotlin类?我正在谈论类似的事情,但是使用Kotlin API:如何以编程方式编译和实例化Java类?
例如:我正在获得完整的类定义为String:
val example = "package example\n" +
"\n" +
"fun main(args: Array<String>) {\n" +
" println(\"Hello World\")\n" +
"}\n"
Run Code Online (Sandbox Code Playgroud)
然后将其插入某个class.kt中并运行它,以便在运行时在控制台中打印“ Hello World”。
我编写了一些代码来编译Java源代码.然后它生成.class文件.问题是我该如何运行它?
例如,我对正在设置的程序和类的名称没问题,我使用了prog p = new prog(),但是,在这种情况下,类文件在编译之前还不存在.不太确定该怎么做.有人可以给我一个建议吗?
顺便说一句,这个类看起来像这样:
public void compile{
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
}
public void run(){
Prog prog = new Prog();
prog.run();
}
Run Code Online (Sandbox Code Playgroud)