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 !!
}
Run Code Online (Sandbox Code Playgroud)
会发生什么ClassPool.getDefault();?
我有同样的问题,发现ClassPool.getDefault没有抛出Exception,但是Throwable.实际上,它正在抛出java.lang.NoClassDefFoundError.在我的清单中,我有:
Premain-Class: timing.TimingTransform
Boot-Class-Path: lib/javassist.jar
Run Code Online (Sandbox Code Playgroud)
您可能只需要将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
Run Code Online (Sandbox Code Playgroud)
我把它放在代理jar文件中的javassist.jar中,而不是放在程序可访问的外部目录中.在那次改变之后,它运作良好.
| 归档时间: |
|
| 查看次数: |
2079 次 |
| 最近记录: |