我在Java项目中读取光盘中的文件。我在D:/上找到了我的hohoho.java文件,它是文件格式,然后我想把它作为一个类添加到我的主类(Up.java)的现有包中。它应该看起来像这样 - 包 - > Up.java,Hohoho.java。
当然应该以编程方式完成。我将使用这个.java文件及其在我的Up.java中的函数。
你知道这么简单吗?
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;
public class Up{
public static void main(String[] args) {
File root = new File("..\\.");
File myfile = null;
try {
String[] extensions = {"java"};
boolean recursive = true;
Collection files = FileUtils.listFiles(root, extensions, recursive);
for (Iterator iterator = files.iterator(); iterator.hasNext();) {
File file = (File) iterator.next();
String path = file.getAbsolutePath();
System.out.println("File = " + path);
String[] tokens = path.split("\\\\");
for (String t : tokens)
if (t.equals("Hohoho.java")){
myfile = file;
}
}
System.out.println("Client class: " + myfile.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
使用Java Compiler API将源代码编译为字节码。
之后使用ClassLoader将已编译的类加载到jvm中,您就可以执行该类的方法。
如果您确定,该编译类实现了特定的接口 - 您可以将其强制转换为目标接口并直接调用方法,否则 - 您需要使用Reflection
答案 1 :(得分:1)
如果您只需要加载.class文件,根据您的评论,您应该能够使用以下内容(假设您的设置中没有安全问题):
String path = "/path/to/your/classfiles/root/"; //not including the package structure
ClassLoader loader = new URLClassLoader(new URL[]{new URL("file://" + path)}, Up.class.getClassLoader());
Class clazz = loader.loadClass("foo.Hohoho"); //assuming a package "foo" for that class
Object loadable = clazz.newInstance();
Field field = loadable.getClass().getField("someField"); //or whatever - (this assumes you have someField on foo.Hohoho)
System.out.println(field.get(loadable));
(我在上面删除了所有异常处理)。正如@stemm指出的那样,使用纯反射会很痛苦。
此外,还可以快速测试从VM内部以尽可能最简单的方式调用java编译器。所以,如果你需要从源头开始,你可以建立起来:
String sourcePath = "/path/to/your/javafiles/root/";
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int success = compiler.run(null, null, null, sourcePath + "foo/Loadable.java");//can't get "-sourcepath","path" to go, for some reason.
System.out.println("success = " + success); //should be 0; Sys err should have details, otherwise