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

时间:2015-10-12 05:08:34

标签: java file-read

是否有可能从另一个类中读取.java文件(使用文件路径)并在此类中调用其方法?

让我们把一个java类作为

public Mylogic {

public static void test()

{
 //some logic

}

}

有没有办法让另一个java类可以将Mylogic.java文件作为文件读取并执行test()方法 ?

为什么我要这个?

一旦source code进入应用程序服务器,如果我必须添加另一个类,我必须等待完成部署,这需要时间。如果我能够这样做,我可以保留{{1}准备在utility class中从dir读取source code文件并在不进行任何部署的情况下执行它,从而节省时间。 这适用于更高的环境(生产模式),因此没有爆炸模式。

1 个答案:

答案 0 :(得分:0)

如果在运行代码时使用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();
    }
}