1

我想从文件(.text 或 .java)中获取所有方法,但我还不知道文件的名称(用户可以使用 jFileChooser 选择它)。所以我不知道班级的名字。我有这个代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import javax.swing.JFileChooser;


public class Test {

   public static void main(String[] args) throws Throwable {

        JFileChooser fc = new JFileChooser();
        File f = null;
        if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            f = fc.getSelectedFile();
        }
        int errorCode = com.sun.tools.javac.Main.compile(new String[]{
                    "-classpath", "bin",
                    "-d", "../Tmp",
                    f.getAbsolutePath()});


        System.out.println("errorCode:" + errorCode);
        File classesDir = new File("../Tmp");


        ClassLoader parentLoader = Test.class.getClassLoader();

        URLClassLoader loader1 = new URLClassLoader(
                new URL[]{classesDir.toURL()}, parentLoader);

        BufferedReader br = new BufferedReader(new FileReader(f));
        String load = "";
        while ((load = br.readLine()) != null) {
            if (load.startsWith("package")) {
                load = load.replaceAll("package", "") + "." + f.getName().substring(0, f.getName().indexOf("."));
                load = load.replace(";", "").trim();
                break;
            }
        }
        Class cls1 = loader1.loadClass(load);
        Method[] methods = cls1.getDeclaredMethods();
        for (Method m : methods) {      
            System.out.println(m.getName());
        }
    }
}

如果该类不包含“扩展”或使用另一个类的方法,它可以工作,但如果是这样,我会收到错误。我应该怎么做才能解决这些问题?我认为它与“classpath”和“bin”有关

4

1 回答 1

3

它确实与-classpath bin选项有关。编译器需要能够访问目标类所依赖的所有类。如果你想继续使用这种方法,你必须给用户一些方法来定义他们自己的类路径,包括“bin”以外的东西。

目前尚不清楚您的目标是什么,但其他选项包括:

  • 使用用户已经编译的类
  • 只需解析文件,而不是将其编译成 Java 类

详细说明第二个选项,您可以使用Java 解析器来分析文本。通常解析器会创建一个树结构,一个抽象语法树,编译器会遍历它,通常会多次执行不同的编译步骤。但是,解析后不一定要编译;你可以在 AST 上做任何你喜欢的分析。

我使用了 ANTLR Java 语法。它生成一个 AST,而 ANTLR 工具包提供了一种语法,您可以使用该语法编写一个“树解析器”,当它在 AST 中找到某些结构时执行您编写的操作。这种“树解析器”概念是 ANTLR 独有的;大多数语法只会以 AST 结束。

于 2012-11-10T15:57:05.853 回答