我有一个使用JCodemodel和动态类加载器生成类的程序。我解析一个yaml文件,生成所需的类并映射文件的结构。到目前为止,一切都很好。
Snakeyaml处理解析并写得很好,所以类的定义很好。
然后我尝试访问在yaml中重新定义的方法 properties()。
我首先将文件加载到“Tree”中,将其根元素加载为“Compute”并打印其类和方法;然后我调用重写的方法。 动态生成 computeb 类,以及 computeb $ Properties 。
这是代码(我用更短的代码替换了我的包):
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());
结果是:
class:class computeb
方法:public computeb $ Property computeb.properties()
方法:public mypackage.Compute $ Property mypackage.Compute.properties()
(...)
properties()类是mypackage.Compute $ Property
正如您所注意到的,该类具有两种方法,但是调用的properties()方法是第二种方法。我想调用第一个(在类加载器中定义)。为什么会这样?我该怎么办?
答案 0 :(得分:0)
好的,我得到了它,在静态生成特定文件夹上的类时遇到了问题。
由于我必须解决现有的类以避免创建它们两次,所以我只解析了以我的包前缀开头的类。
这在静态生成中运行良好,但在动态生成中,我之前生成了无法加载的类,而它们已经存在。基本上这意味着我的类生成器正在创建另一个具有相同名称的类,因此有时类加载器可以引用一个类,有时引用另一个类。
我正在努力纠正这个肮脏的混乱。