Получение класса javassist с playframework - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь получить ссылку 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, но безуспешно.

1 Ответ

0 голосов
/ 01 марта 2012

Обычно вам не следует трогать класс 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;
}
...