2012-03-01 6 views
1

Я пытаюсь получить ссылку CtClass на мой класс модели. Я начал с самой простой версии ClassPool.getDefault().get(className);, и все прошло отлично. Но только на моей машине. Он не работает на сервере.Получение класса javassist с playframework

В любом случае, я думаю, что версия не должна работать, потому что Playframework хранит классы в tmp/classses. Итак, к настоящему времени я закончил с этой версией:

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, тогда вы можете получить экземпляр класса javassist, вызвав метод makeClass(ApplicationClass appClass).

Для получения обоснованного примера см. https://github.com/greenlaw110/play-morphia/blob/master/src/play/modules/morphia/MorphiaEnhancer.java.

PS: О play.classloading.enhancers.Enhancer.makeClass реализации метода

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

Где classPool приходит из следующего кода:

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

Смежные вопросы