2

クラスのソースコードから形成されたバイトコードからクラス名を掘り​​出すことは可能ですか?

状況は次のとおりです。クラスのバイトコードをどこかからリモートで取得します。それがどこから来たかは問題ではありません。そのクラスをクラスローダーで効果的にロードするには、クラス名も必要です...そうですか?

4

6 に答える 6

2

最も簡単な方法は、おそらくASMのようなものを使用することです:

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.commons.EmptyVisitor;

public class PrintClassName {
  public static void main(String[] args) throws IOException {
    class ClassNamePrinter extends EmptyVisitor {
      @Override
      public void visit(int version, int access, String name, String signature,
          String superName, String[] interfaces) {
        System.out.println("Class name: " + name);
      }
    }

    InputStream binary = new FileInputStream(args[0]);
    try {
      ClassReader reader = new ClassReader(binary);
      reader.accept(new ClassNamePrinter(), 0);
    } finally {
      binary.close();
    }
  }
}

サードパーティのライブラリを使用できない場合は、クラス ファイル形式を自分で読み取ることができます。

于 2009-10-30T13:26:21.683 に答える
1

javapたまに発生する場合は、バイトコードを逆アセンブルするために使用できるはずです。

実行時に実行するには、Apache の BCEL ( http://jakarta.apache.org/bcel ) などのバイトコード操作ライブラリを使用して、バイト コードを分析します。

于 2009-10-30T13:00:31.783 に答える
0

ClassLoader のサブクラスで ClassLoader.defineClass メソッドを使用して、特定のバイトコードの Class オブジェクトを取得できると思います。(未検証)

于 2009-10-30T13:27:29.683 に答える