gpt4 book ai didi

java - 从java中选定文件的类获取方法

转载 作者:行者123 更新时间:2023-11-29 05:52:41 25 4
gpt4 key购买 nike

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

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”做些什么

最佳答案

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

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

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

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

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

关于java - 从java中选定文件的类获取方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com