有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

读一本书。java文件,并调用其方法

是否可以从另一个类中读取.java文件作为文件(使用文件路径),并在该类中调用其方法

让我们以java类为例

public Mylogic {

public static void test()

{
 //some logic

}

}

有没有其他java类可以将Mylogic.java文件作为文件读取并执行test()方法的方法 ?

我为什么要这个

一旦source code进入应用服务器,如果我必须添加另一个类,我必须等待完成部署,这需要时间。如果我能够做到这一点,我可以在source code中保持一个utility class就绪,以便从dir读取.java文件并执行它,而无需任何部署,从而节省时间。 这是为了更高的环境(生产模式),所以没有分解模式


共 (1) 个答案

  1. # 1 楼答案

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