运行时编译类并使用它

时间:2016-02-06 01:00:55

标签: java classloader

我想创建一个交互式程序,允许用户在程序运行时更改一个方法的行为。用户应该能够改变

之间的所有内容
public int result(){

}

然后,程序应该能够访问此方法并执行它需要执行的操作。

这在Java中可行吗?我听说过有关ClassLoader的一些信息,但无法找到如何使用它的好建议。

3 个答案:

答案 0 :(得分:1)

您可以使用Java Runtime Compiler来获取字符串中的代码,从内存中编译它并将其加载到当前的ClassLoader或您选择的一个。

这是一个Hello World计划

 String className = "mypackage.MyClass";
 String javaCode = "package mypackage;\n" +
                  "public class MyClass implements Runnable {\n" +
                  "    public void run() {\n" +
                  "        System.out.println("\"Hello World\");\n" +
                  "    }\n" +
                  "}\n";
 Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(className, javaCode);
 Runnable runner = (Runnable) aClass.newInstance();
 runner.run();

在你的情况下,String需要看起来像

 String codeInMethod = ....
 String javaCode = "package mypackage;\n" +
                   "public class MyClass implements ReturnsInt {\n" +
                   "    public int result() {\n" +
                   codeInMethod +
                   "    }\n" +
                   "}\n";

您需要为其实现创建接口,因为这是在创建类时调用类实例的方法。 (或者你可以使用反射,这将是一种耻辱)

注意:您应该只对您信任的代码执行此操作,否则代码可以对您的计算机执行任何操作。

答案 1 :(得分:0)

Byte Buddy是你的朋友。

它是一个代码生成库,用于在Java应用程序的运行时期间创建Java类,而无需编译器的帮助。

答案 2 :(得分:-2)

使用类加载器是不可能的。 Java是一种编译语言,其中计算机执行的所有指令都是从您编写的特殊文件的代码中编码或编译。为了为用户实现交互式方法,您必须创建自己的Java解释器。有关更多信息,请参阅此处

  

http://introcs.cs.princeton.edu/java/82compiler/