运行用户创建的Java类

运行用户创建的Java类,java,class,instantiation,Java,Class,Instantiation,在我的主程序中,我允许用户创建Java类,并将它们存储在包UserInputs中的.Java文件中。我现在正在寻找一种方法,在我的主程序中实例化用户创建的类,并在该类中运行公共方法 下面是当用户按下JButton完成类创建时执行的代码 public void actionPerformed(ActionEvent e) { if(e.getSource() == inputButt.getButtons()){ try{ PrintWriter

在我的主程序中,我允许用户创建Java类,并将它们存储在包
UserInputs
中的
.Java
文件中。我现在正在寻找一种方法,在我的主程序中实例化用户创建的类,并在该类中运行公共方法

下面是当用户按下
JButton
完成类创建时执行的代码

public void actionPerformed(ActionEvent e) {

    if(e.getSource() == inputButt.getButtons()){
        try{

            PrintWriter writer = new PrintWriter("C:/Users/human/Desktop/UserInputTest/src/UserInputs/UserCreatedClass.java", "UTF-8");
            writer.println(textArea.getText());
            writer.close();

        }catch(Exception except){
            except.printStackTrace();
        }
    }   
}

您需要在运行时编译该文件。也许你可以在这里发布,这样对你有帮助

第一个链接说的是您应该使用Java6编译器API。您需要做的是:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compilationResult = compiler.run(null, null, null, fileToCompile);
其中
fileToCompile
是文件的路径,在您的示例中是“C:/Users/human/Desktop/UserInputTest/src/UserInputs/UserCreatedClass.java”。然后可以通过反射执行代码


不过,我会非常小心地让人们创建和执行自己的Java代码。我不知道您打算做什么,但如果您在服务器上运行此代码,我不建议您做这样的事情。如果此应用程序应该在客户端计算机上本地运行(因此它们只能伤害自己),这应该不是问题。否则,我不会让他们编程他们想要的。

你可能还想考虑Groovy编译器,它几乎完全兼容java语法,功能更强大,API也更简单。p>
我不认为你们可以像你们建议的那个样在运行时编译java文件。有趣的问题是,但我认为这是不可能的。当你运行主程序时,UserCreatedClass.java还没有被编译,那么它怎么能被实例化呢?可能是@OlivierH的副本我不认为这是这篇文章的副本,因为他想编译和执行一个动态创建的java文件,而不想通过字节码操作创建一个。所以我按照你的建议做了,并使用这个网站来帮助我调用这些方法:
ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(new File("src/test/groovy/script/HelloWorld.groovy"));

// let's call some method on an instance
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object[] args = {};
groovyObject.invokeMethod("run", args);