0

Javassist를 사용하여 간단한 계측 에이전트를 작성하려고합니다. java.lang.invoke.MethodHandleImpl는 자바에서 발견/랭/호출 : 자바/랭// MethodHandleImpl를 호출을 찾을 수 없습니다 :classPool.get (className) throws RuntimeException 클래스를 찾을 수 없습니다.

java.lang.RuntimeException가 :

public class Agent implements ClassFileTransformer { 

    protected Instrumentation instrumentation; 
    protected ClassPool classPool; 

    public Agent(Instrumentation instrumentation){ 

     this.instrumentation = instrumentation; 
     this.classPool = ClassPool.getDefault(); 
     this.instrumentation.addTransformer(this); 
    } 

    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { 

     try { 

      System.out.printf("%s.transform: %s\n", this.getClass().getCanonicalName(), className); 

      classPool.insertClassPath(new ByteArrayClassPath(className, classfileBuffer)); 

      CtClass ctClass = classPool.get(className); /* <- throws error */ 
     } 
     catch (Exception ex){ 
      System.out.println(ex); 
      return null; 
     } 
    } 
} 

는하지만 다음과 같은 오류를 얻을 수 /MethodHandleImpl.class

이 예외가 발생하지 않는 유일한 클래스는 IDE (인 IntelliJ의 IDEA)에서 내 프로젝트의 하나입니다.

클래스 경로에서 수동으로 경로를 추가하려고했지만 그 중 하나도 도움이되지 않았습니다. 즉

String[] cpEntries = System.getProperty("java.class.path").split(File.pathSeparator); 
for (String cpEntry : classpathEntries) 
    classPool.insertClassPath(cpEntry); 

무엇이 누락 되었습니까? 감사!

답변

1

문제는 classPool.get(className). 구분 기호를 기대하면서 클래스 이름의 구분하는 / 것을, 그래서 수정은 이러한 문자, 즉 :

String classNameDotted = className.replace('/', '.'); 
CtClass ctClass = classPool.get(classNameDotted); 
를 대체하는 것입니다
관련 문제