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

クラスに「extends」が含まれていない場合、または別のクラスのメソッドを使用している場合は機能しますが、含まれている場合はエラーが発生します。これらの問題を解決するにはどうすればよいですか? 「クラスパス」と「ビン」で何かをしなければならないと思います

4

1 に答える 1

3

それは-classpath binオプションと関係があります。コンパイラは、ターゲット クラスが依存するすべてのクラスにアクセスできる必要があります。このアプローチを使い続けたい場合は、「bin」以外のものを含めるために、独自のクラスパスを定義する方法をユーザーに提供する必要があります。

あなたの目標が何であるかは明確ではありませんが、他のオプションには次のものがあります。

  • ユーザーが既にコンパイルしたクラスの操作
  • ファイルを Java クラスにコンパイルするのではなく、単純に解析する

2 番目のオプションについて詳しく説明すると、Java パーサーを使用してテキストを分析できます。通常、パーサーはツリー構造 (抽象構文ツリー) を作成し、コンパイラーはそれをトラバースし、多くの場合、さまざまなコンパイル手順を数回実行します。ただし、解析の後にコンパイルを行う必要はありません。AST で好きな分析を行うことができます。

ANTLR Java 文法を使用しました。これは AST を生成し、ANTLR ツールキットは、AST で特定の構造を見つけたときに記述したアクションを実行する「ツリー パーサー」を記述するために使用できる文法を提供します。この「ツリー パーサー」の概念は、ANTLR に固有のものです。ほとんどの文法は AST で終わります。

于 2012-11-10T15:57:05.853 に答える