从所选文件获取方法';java中的s类
我想从一个文件(.text或.java)中获取所有方法,但我还不知道该文件的名称(用户可以使用jFileChooser进行选择)。所以我不知道这个班的名字。我有以下代码:从所选文件获取方法';java中的s类,java,reflection,classloader,Java,Reflection,Classloader,我想从一个文件(.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 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());
}
}
}
如果该类不包含“extends”或使用另一个类的方法,则它可以工作,但如果它包含“extends”,则会出错。
我应该如何解决这些问题?我认为它与“classpath”和“bin”有关,它与
-classpath-bin
选项有关。编译器需要访问目标类所依赖的所有类。如果您想继续使用这种方法,您必须给用户一些方法来定义他们自己的类路径,以包含除“bin”之外的内容
不清楚您的目标是什么,但其他选项包括:
- 使用用户已编译的类
- 只需解析文件,而不是将其编译为Java类
在详细说明第二个选项时,您可以使用a来分析文本。通常,解析器将创建一个树结构,一个抽象语法树,编译器将遍历该树,并执行不同的编译步骤。然而,解析之后不必进行编译;你可以在AST上做任何你喜欢的分析
我使用了ANTLR Java语法。它生成一个AST,ANTLR工具包提供了一个语法,您可以使用它编写一个“树解析器”,当它在AST中找到某些结构时,执行您编写的操作。这个“树解析器”概念是ANTLR所独有的;大多数语法都会停止使用AST。我不坚持这一点,但这是唯一能起作用的方法。这条路并不重要,我真的需要让它运转起来。已经编译的类不是一个选项,你能告诉我第二个吗,你是什么意思?谢谢。@user1796823在我的回答中添加了一点解释。谢谢你试图帮助我,但这对我来说太难了,我不知道怎么做。你有考试或者其他什么吗?