2016-08-10 2 views
0

특정 클래스를 선언하는 Groovy 스크립트가 있습니다. javassist를 통해 같은 스크립트에서이 클래스에 액세스 할 수 있습니까? 그것을 위해 CtClass 객체를 생성해야합니다.Groovy 스크립트에서 선언 된 클래스를 javassist에서 액세스 할 수 있습니까?

Caught: javassist.NotFoundException: TestClass 
javassist.NotFoundException: TestClass 
    at javassist.ClassPool.get(ClassPool.java:450) 
    at javassist.ClassPool.getCtClass(ClassPool.java:515) 
    at javassist.ClassPool$getCtClass$0.call(Unknown Source) 
    at test.run(test.groovy:14) 

그것은 스크립트의 외부에서이 클래스를 이동 물론 가능하고 :

import javassist.*; 

public class TestClass { 
    public String testMethod(String x) { 
     return x + "."; 
    } 
} 

// I can use TestClass now for ordinary operations 
TestClass obj = new TestClass(); 
println(obj.testMethod("a")); 

ClassPool pool = ClassPool.getDefault(); // ? 
CtClass cc = pool.getCtClass("TestClass"); // this doesn't work 

이 마지막 문자열이 오류가 발생합니다 : 여기

스크립트, test.groovy의 예입니다 그것을 .class 파일로 컴파일하면 쉽게로드 할 수 있습니다. 스크립트에서이 클래스를 다시 바이트 배열이나 .class 파일로 동적으로 컴파일 한 다음 javassist에로드하는 것도 가능하다고 생각합니다. 그러나이 클래스를 추가로 (다시) 컴파일하지 않고이 작업을 수행하고 일반 작업에서 이미 액세스 할 수있는 클래스를 사용할 수 있습니까?

답변

1

사용자 정의 코드 소스를 Javassist ClassPool에 등록 할 수 있습니다. 기본적으로 Javassist는 ClassPool.getDefault()을 호출하면 클래스 경로에서 클래스 파일을 읽습니다. Groovy에서 클래스 파일을 가져와야합니다.

이 작업을 수행하는 한 가지 방법은 ClassFileTransformer을 사용하여 클래스 파일을 읽을 수있는 Java 에이전트에서 클래스 파일을 읽는 것입니다. 또 다른 방법은 모든 클래스가 findClass을 통해 전달되는 스크립트를로드하는 Groovy 클래스 로더에 연결하는 것입니다.

관련 문제