2011-10-07 206 views
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();會發生什麼?ClassPool.getDefault();在Javassist中沒有做任何事

+0

你是否看到任何異常? –

+0

@ThomasUhrig否:(非常奇怪我會變得瘋狂 - 當我刪除printLn時,我可以看到異常... – JohnJohnGa

回答

6

我有同樣的問題,並發現ClassPool.getDefault沒有拋出異常,但Throwable。其實它是拋出java.lang.NoClassDefFoundError。 在我的表現,我有:

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

您可能只需要引導級路徑指向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文件中,我把它放在程序可訪問的外部目錄中。改變之後,它運行良好。

+0

添加boot-class-path選項仍然給了我相同的錯誤,添加這個'-Xbootclasspath/a:javassist -3.20.0-GA.jar'在執行jar時解決了我的問題。 – codeln