0

ファイルを分析するプログラムを書いてい.classます。パッケージとクラス名を出力に添付したい。

私の計画は、パッケージとクラス名を入力として取り、対応する.classファイルを見つける関数を作成することです (したがって、ユーザーはそれを入力する必要がなく、間違いを犯すことはありません)。 「BCEL のClassParserコンストラクターの引数として使用できるデータを教えてください」(ファイル名、または zip ファイルの名前と zip ファイル内の名前のいずれか) と読みます。

どうすればいいですか?Javaにはそれを行うものが付属していますか?名前解決は a のコンテキストで行われることを理解しているCLASSPATHので、ユーザーはおそらくそれらのいずれかも提供する必要があります。それはいいです。

注: ソリューションでは、ファイルからコードを実行しないでください。.classバイトだけです、奥様;-)

4

3 に答える 3

1

BCEL を使用している場合は、すべてが既に存在します。以下を参照してくださいClassPath

import java.io.IOException;
import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.util.ClassPath;

public class BcelTest {
    public static void main(String[] args) throws IOException {
        String classPath=System.getProperty("java.class.path");
        // demonstrating with our own class path examplary for an arbitrary path String
        ClassPath cp=new ClassPath(classPath);
        ClassPath.ClassFile cf=cp.getClassFile(BcelTest.class.getName());
        ClassParser p=new ClassParser(cf.getInputStream(), cf.getPath());
        JavaClass jc = p.parse();
        System.out.println(jc);

        // or just using our own system path explicitly
        cf=ClassPath.SYSTEM_CLASS_PATH.getClassFile("java.lang.Object");
        p=new ClassParser(cf.getInputStream(), cf.getPath());
        jc = p.parse();
        System.out.println(jc);
    }
}
于 2016-06-28T15:44:05.450 に答える
0

irc://freenode.org/##java次のレシピに私を導いてくれた素晴らしい人々に感謝したい:

// replace 'Throwable' with something else in production code :-)
JavaClass recipe() throws Throwable {
    URLClassLoader loader = new URLClassLoader(new URL[] {
            new URL("file:///usr/share/java/js.jar"),
        });
    String path = "org/mozilla/classfile/ByteCode.class";
    InputStream resource = loader.getResourceAsStream(path);
    String fake_filename = "<" + path + ">";
    ClassParser classparser = new ClassParser(resource, fake_filename);
    JavaClass java_class = classparser.parse();
    // System.out.format("%s\n", jc);
    return java_class;
}

pathユーザー入力に基づいて適切な形式で文字列を計算することにより、クラスパスと の値をハードコーディング解除できます。

私の側での作業が少ないため、受け入れた回答を使用しますが、より一般的に適用できる(つまり、依存関係が少ない)ため、この回答に言及したいと思います。

于 2016-06-30T22:41:52.817 に答える
0

クラスファイルが既にある場合は、クラス名のすべての / をシステムのディレクトリ区切り記号に置き換え、.class を追加します。

Java クラス名からバイトコード クラス名に変更したい場合、ほとんどのクラスは非常に単純です。パッケージ + '.' を先頭に追加します。'.' を置き換えます。と '/'。内部およびネストされたクラスの場合、単純なアルゴリズムがあるかどうかはわかりません。

于 2016-06-25T23:04:19.343 に答える