5
public byte[] transform(ClassLoader loader, String className, Class<?> clazz,
            ProtectionDomain domain, byte[] bytes)
    throws IllegalClassFormatException {
        return inspectClass(className, clazz, bytes);
}

private byte[] inspectClass(String name, Class<?> clazz, byte[] b) {
        System.out.println("here"); //OK I see this print
        ClassPool pool = ClassPool.getDefault();
        System.out.println("inclass"); //can't see it !!
}

で何が起こる可能性がありClassPool.getDefault();ますか?

4

1 に答える 1

6

私は同じ問題を抱えていて、ClassPool.getDefault が Exception をスローしていないことがわかりましたが、Throwable です。実際、java.lang.NoClassDefFoundError をスローしていました。私のマニフェストには、次のものがありました。

Premain-Class: timing.TimingTransform
Boot-Class-Path: lib/javassist.jar

おそらく、Boot-Class-Path を javassist.jar ファイルにポイントする必要があるだけです。私の場合、上記の Boot-Class-Path では、javassist.jar を含む lib ディレクトリが必要でした。

私が最初に犯した間違いは、javassist.jar をエージェント jar ファイル内に配置したことでした (以下は正しくありません。デモンストレーションのみを目的としています)。

     0 Mon Oct 24 16:58:14 MST 2011 META-INF/
   146 Mon Oct 24 16:58:14 MST 2011 META-INF/MANIFEST.MF
     0 Thu Oct 20 14:58:06 MST 2011 timing/
  2482 Mon Oct 24 16:58:06 MST 2011 timing/TimingStats.class
  8360 Mon Oct 24 16:58:06 MST 2011 timing/TimingTransform.class
     0 Tue Oct 18 17:28:24 MST 2011 lib/
645252 Fri Jul 08 18:24:58 MST 2011 lib/javassist.jar

javassist.jar をエージェント jar ファイル内に配置するのではなく、プログラムからアクセスできる外部ディレクトリに配置しました。その変更後、それはうまくいきました。

于 2011-10-25T00:25:20.030 に答える