0

我从我的 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();
    }     

   }
}
4

2 回答 2

1

使用Java Compiler API将源代码编译成字节码。

之后使用ClassLoader将编译后的类加载到 jvm 中,您就可以执行该类的方法。

如果你确定,那个编译的类实现了特定的接口——你可以将它转换为目标接口并直接调用方法,否则——你需要使用反射

于 2012-11-15T11:49:03.683 回答
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
于 2012-11-16T03:23:54.327 回答