Получение класса javassist с помощью playframework

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

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

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

Но я не уверен в этой версии. Будет ли это работать всегда? Есть ли лучшие варианты?

Я также пытался использовать ClassClassPath и LoaderClassPath, но безуспешно.


person sdespolit    schedule 01.03.2012    source источник


Ответы (1)


Обычно вам не следует прикасаться к классу 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;
}
person Gelin Luo    schedule 01.03.2012
comment
Спасибо. Что ж, спасибо, что сказали, что мне следует избегать его использования;) Мне нужен CtClass для чтения конфигурации из аннотаций, а стандартный java.reflection не дает того, что мне нужно. - person sdespolit; 01.03.2012