系统类加载器不使用overriden方法

时间:2017-01-31 14:53:14

标签: java classloader

我有一个使用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()方法是第二种方法。我想调用第一个(在类加载器中定义)。为什么会这样?我该怎么办?

1 个答案:

答案 0 :(得分:0)

好的,我得到了它,在静态生成特定文件夹上的类时遇到了问题。

由于我必须解决现有的类以避免创建它们两次,所以我只解析了以我的包前缀开头的类。

这在静态生成中运行良好,但在动态生成中,我之前生成了无法加载的类,而它们已经存在。基本上这意味着我的类生成器正在创建另一个具有相同名称的类,因此有时类加载器可以引用一个类,有时引用另一个类。

我正在努力纠正这个肮脏的混乱。