从另一个类读取.java文件并调用其方法
是否可以使用另一个类中的file path将.java文件作为文件读取,并在此类中调用其方法 让我们以java类为例从另一个类读取.java文件并调用其方法,java,file-read,Java,File Read,是否可以使用另一个类中的file path将.java文件作为文件读取,并在此类中调用其方法 让我们以java类为例 public Mylogic { public static void test() { //some logic } } 是否有其他java类可以将Mylogic.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。