0

私はJavassistを使用して簡単な計測エージェントを作成しようとしています。classPool.get(className)throws 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; 
     } 
    } 
} 

しかし、私は次のエラーを取得:

java.lang.RuntimeExceptionをします。java/LANG /起動/ MethodHandleImplを見つけることができません:java.lang.invoke.MethodHandleImplは、java/LANG /呼び出しで見つかりました/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); 
を交換することです
関連する問題