从另一个类读取.java文件并调用其方法

从另一个类读取.java文件并调用其方法,java,file-read,Java,File Read,是否可以使用另一个类中的file path将.java文件作为文件读取,并在此类中调用其方法 让我们以java类为例 public Mylogic { public static void test() {  //some logic } } 是否有其他java类可以将Mylogic.java文件作为文件读取并执行测试方法的方法 ? 我为什么要这个 一旦源代码进入应用程序服务器,那么如果我必须添加另一个类,我必须等待需要时间的完整部署。如果我能够做到这一点,我可以在源代码中保留一个实用

是否可以使用另一个类中的file path将.java文件作为文件读取,并在此类中调用其方法

让我们以java类为例

public Mylogic {

public static void test()

{
 //some logic

}

}
是否有其他java类可以将Mylogic.java文件作为文件读取并执行测试方法的方法 ?

我为什么要这个

一旦源代码进入应用程序服务器,那么如果我必须添加另一个类,我必须等待需要时间的完整部署。如果我能够做到这一点,我可以在源代码中保留一个实用程序类,以便从dir读取.java文件并执行它,而无需任何部署,从而节省时间。
这适用于更高的环境生产模式,因此没有分解模式。

如果在运行代码时使用JDK而不是JRE,则可以使用javax.tools.JavaCompiler和自定义类加载器:

import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;


public class LoadAndRun extends ClassLoader {

    public Class findClass(String name) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            InputStream in = new FileInputStream("./" + name + ".class");

            byte [] buff = new byte[4096];
            while (true) {
                int c = in.read(buff);
                if (c == -1) break;
                out.write(buff, 0, c);
            }

            return defineClass(name, out.toByteArray(), 0, out.toByteArray().length);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String [] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
        // Try to get the system compiler
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        if (compiler == null) {
            System.err.println("System java compiler not found.");
            return;
        }

        // Prepare the java file to be compiled
        String classname = "LoadAndRun" + System.currentTimeMillis();
        File javaFile = new File(classname + ".java");

        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(javaFile)));
        writer.write("public class " + classname + "{\n");
        writer.write("public static void test() {System.out.println(\"this is the test class:\"+"+classname+".class);}");
        writer.write("}\n");
        writer.close();

        // Compile it!
        StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
        compiler.getTask(null, fileManager, null, null, null, fileManager.getJavaFileObjects(javaFile)).call();

        // Load and invoke static method
        ClassLoader classLoader = new LoadAndRun();
        Class cls = classLoader.loadClass(classname);
        Method m = cls.getMethod("test");
        m.invoke(null);

        // Clean up
        m = null;
        cls = null;
        classLoader = null;

        System.gc();

        javaFile.delete();
        File classFile = new File(classname + ".class");
        classFile.delete();
    }
}

是否有任何东西阻止您实例化Mylogic类,然后使用生成的对象?你能在这里补充一些你想要达到的目标的背景知识吗?@TimBiegeleisen:test是静态方法。我们不需要Mylogic类的实例。还有livinggourmand,你们是在试图理解一个类的静态方法吗?如果是,则任何类都可以调用在另一个类中声明的公共静态方法,该类是公共的,如您的示例:Mylogic。我猜,你的意思是读取一个文件并执行-你实际上是说,在不实例化Mylogic类的情况下直接调用测试方法?@a3.14Infinity,为了进行静态调用,他仍然需要有相同的设置,允许实例化,例如,将类引入他的类路径并适当构建。@Tim我添加了更多内容details@livinggourmand:根据添加的详细信息,我的上述假设是错误的。我对eclipse进行了更改以使用jdk1.8.0_25,并通过eclipsec.exe-vm C:\Program Files\Java\jdk1.8.0_25\bin\javaw.exe重新启动了eclipse,但它仍在选择jre7\bin\javaw.exe。