2011-10-07 8 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 !! 
} 

Điều gì có thể xảy ra trong ClassPool.getDefault();?ClassPool.getDefault(); không có gì trong Javassist

+0

bạn có thấy ngoại lệ không? –

+0

@ThomasUhrig no :(rất lạ tôi sẽ trở nên điên rồ - khi tôi xóa printLn tôi có thể thấy ngoại lệ ... – JohnJohnGa

Trả lời

6

Tôi đã gặp sự cố tương tự và đã tìm thấy ClassPool.getDefault không ném ngoại lệ, nhưng có thể Throwable. Trong thực tế, nó đã được ném java.lang.NoClassDefFoundError. Trong manifest của tôi, tôi đã có:

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

Bạn có thể chỉ cần trỏ Boot-Class-Path đến tập tin javassist.jar. Trong trường hợp của tôi, với Boot-Class-Path ở trên, tôi cần một thư mục lib với javassist.jar trong đó.

Sai lầm tôi đã thực hiện bước đầu đã được đưa javassist.jar bên trong tập tin đại lý jar (sau đây là sai, chỉ để minh chứng CHỈ):

 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 

Thay vì đặt javassist.jar bên trong tập tin đại lý jar , Tôi đặt nó vào một thư mục bên ngoài có thể truy cập vào chương trình. Sau sự thay đổi đó, nó hoạt động tốt.

+0

Thêm tùy chọn đường dẫn lớp khởi động vẫn cho tôi lỗi tương tự. Thêm này '-Xbootclasspath/a: javassist -3.20.0-GA.jar 'trong khi thực hiện các jar giải quyết vấn đề cho tôi. – codeln