2012-03-01 8 views
1

내 모델 클래스에 대한 CtClass 참조를 얻으려고합니다. 가장 간단한 버전 인 ClassPool.getDefault().get(className);으로 시작했는데 정상적으로 작동했습니다. 하지만 내 컴퓨터에서만. 서버에서는 작동하지 않습니다.playframework로 javassist 클래스 받기

어쨌든 Playframework가 tmp/class에 클래스를 저장하기 때문에 버전이 작동하지 않아야한다고 생각합니다. 이제는이 버전으로 끝났습니다.

ClassPool pool = new ClassPool(); 
pool.appendClassPath(Play.applicationPath + "/tmp/classes"); 
CtClass cls = pool.get(className); 

그러나이 버전에 대해서는 확실하지 않습니다. 항상 작동할까요? 더 나은 옵션이 있습니까?

ClassClassPath 및 LoaderClassPath를 사용했지만 성공하지 못했습니다.

답변

0

플러그인을 작성하고 응용 프로그램 코드를 개선해야하는 경우가 아니면 일반적으로 javassist 클래스를 만지지 않아야합니다. 이 경우 MyPluginEnhancer extends play.classloading.enhancers.Enhancer을 가지면 makeClass(ApplicationClass appClass) 메서드를 호출하여 javassist 클래스 인스턴스를 가져올 수 있습니다.

실행 가능한 예는 https://github.com/greenlaw110/play-morphia/blob/master/src/play/modules/morphia/MorphiaEnhancer.java을 참조하십시오.

PS : 약 play.classloading.enhancers.Enhancer.makeClass 메소드 구현 classPool 다음 코드에서 유래

/** 
* Construct a javassist CtClass from an application class. 
*/ 
public CtClass makeClass(ApplicationClass applicationClass) throws IOException { 
    return classPool.makeClass(new ByteArrayInputStream(applicationClass.enhancedByteCode)); 
} 

:

public Enhancer() { 
    this.classPool = newClassPool(); 
} 

public static ClassPool newClassPool() { 
    ClassPool classPool = new ClassPool(); 
    classPool.appendSystemPath(); 
    classPool.appendClassPath(new LoaderClassPath(Enhancer.class.getClassLoader())); 
    classPool.appendClassPath(new ApplicationClassesClasspath()); 
    return classPool; 
} 
+0

감사합니다. 내가 그것을 사용하지 말아야한다는 것을 말해 주셔서 고마워요.) 주석에서 구성을 읽으려면 CtClass가 필요하고, 표준 java.reflection은 필요한 것을 제공하지 않습니다. – sdespolit

관련 문제