ClassPool.getDefault (); ничего не делает в Javassist - PullRequest
5 голосов
/ 07 октября 2011
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();?

1 Ответ

6 голосов
/ 25 октября 2011

У меня была та же проблема, и я обнаружил, что ClassPool.getDefault не генерирует исключение, а Throwable.Фактически, это было бросание java.lang.NoClassDefFoundError.В моем манифесте у меня было:

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

Вероятно, вам просто нужно указать путь к Boot-Class-Path к файлу javassist.jar.В моем случае с указанным выше Boot-Class-Path мне был нужен каталог lib с javassist.jar.

Первоначально я допустил ошибку, поместив 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 агента, я помещаю его во внешний каталог, доступный для программы.После этого изменения все работало нормально.

...