2011-10-07 3 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가 Exception을 Throw하지 않고 Throwable을 발견했다. 사실, java.lang.NoClassDefFoundError를 던지고있었습니다. 내 매니페스트에서 , 나는했다 :

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

당신은 아마 그냥 javassist.jar 파일에 부팅 클래스 경로를 가리 키도록해야합니다. 제 경우에는 위의 Boot-Class-Path에서 javassist.jar가있는 lib 디렉토리가 필요했습니다.

I 처음 만든 실수 (다음이 들기 위해, 잘못된) 에이전트 JAR 파일 내부 javassist.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 

아닌 에이전트 JAR 파일 내부 javassist.jar 퍼팅 , 나는 그것을 프로그램에 접근 가능한 외부 디렉토리에 넣었다. 그 변화 후, 그것은 잘 동작했습니다.

+0

boot-class-path 옵션을 추가해도 여전히 동일한 오류가 발생했습니다.이'-Xbootclasspath/a : javassist -3.20.0-GA.jar '를 실행하는 동안 문제가 해결되었습니다. – codeln

관련 문제