#java #javassist
#java #javassist
Вопрос:
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. вы видите какое-либо исключение?
2. @ThomasUhrig нет:( очень странно, я сойду с ума — когда я удаляю printLn, я вижу исключение…
Ответ №1:
У меня была та же проблема, и я обнаружил, что ClassPool.getDefault не выбрасывает исключение, а выбрасывает. На самом деле, это был выброс java.lang.Ошибка NoClassDefFoundError. В моем манифесте у меня было:
Premain-Class: timing.TimingTransform
Boot-Class-Path: lib/javassist.jar
Вероятно, вам просто нужно указать путь к загрузочному классу на 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 агента я помещаю его во внешний каталог, доступный для программы. После этого изменения он работал нормально.
Комментарии:
1. Добавление параметра boot-class-path по-прежнему давало мне ту же ошибку. Добавление этого
-Xbootclasspath/a:javassist-3.20.0-GA.jar
во время выполнения jar решило проблему для меня.