2017-01-31 2 views
1

У меня есть программа, которая генерирует классы с использованием JCodemodel и динамического загрузчика классов. Я разбираю файл yaml, генерирую необходимые классы и сопоставляю структуру файла. Пока все в порядке.Системный загрузчик классов не использует метод переопределения

Snakeyaml обрабатывает синтаксический разбор и пишет красиво, поэтому определение классов, если оно прекрасное.

Затем я пытаюсь получить доступ к методу свойства(), который переопределяется в ямле.

Сначала загрузите файл в «Дерево», загрузите его корневой элемент как «Вычислить» и распечатайте его класс и методы; то я вызываю переопределенный метод. computeb класс динамически сгенерирован, а также computeb $ Свойства.

вот код (я заменил мои пакеты от более коротких):

Tree tree = Parser.load(new FileInputStream("src/test/resources/tree.yaml")); 
mypackage.Compute c = (mypackage.Compute) tree.root(); 
System.err.println("class : " + c.getClass()); 
for (Method m : c.getClass().getMethods()) { 
    System.err.println(" method : " + m); 
} 
System.err.println("properties() class is " + c.properties().getClass().getName()); 

В результате получается:

класс: класс computeb
метод: общественный computeb $ computeb.properties собственности()
метод: public mypackage.Compute $ Property mypackage.Compute.properties()
(...)
Недвижимость () class is mypackage.Compute $ Property

Как вы заметили, класс имеет два метода, но метод properties() называется вторым. Я хотел бы назвать первый (который определен в загрузчике классов). Почему так происходит? Что мне делать ?

+1

Похоже, 'c.properties()' возвращает объект 'mypackage.Compute $ Property'. Вы пытались вызвать 'c.properties(). Properties()'? –

+1

Вычисление $ Свойство свойства не имеет свойства(). – guigolum

ответ

0

OK Я понял, у меня была проблема, статически генерируя классы в определенной папке.

Поскольку мне пришлось разрешать существующие классы, чтобы не создавать их дважды, я разрешил только классы, которые начинались с моего префикса пакета.

Это хорошо работает в статическом поколении, но в динамическом поколении я ранее создавал классы, которые я не мог загрузить, пока они уже присутствовали. В основном это означает, что мой генератор классов создавал еще один класс с тем же именем, поэтому иногда загрузчик классов мог ссылаться на один класс, иногда на другой.

Я работаю над исправлением этого грязного беспорядка.