2017-01-31 8 views
1

私はJCodemodelと動的クラスローダーを使用してクラスを生成するプログラムを持っています。私はyamlファイルを解析し、必要なクラスを生成し、ファイルの構造をマップします。これまではすべてが問題ありません。システムクラスローダーはオーバーライドされたメソッドを使用しません

Snakeyamlは解析を行い、うまく書くので、クラスの定義は問題ありません。

次に、yamlで再定義されたプロパティ()にアクセスしようとしています。

まずファイルを「ツリー」にロードし、そのルート要素を「計算」としてロードし、そのクラスとメソッドを出力します。私はオーバーライドされたメソッドを呼び出します。 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()); 

結果は次のとおりです。

クラス:クラスcomputeb
方法:公共computeb $プロパティcomputeb.properties ()
メソッド:public mypackage.Compute $プロパティmypackage.Compute.properties()
(...)
プロパティ)クラスはmypackage.Compute $ Propertyです。

気付いたように、クラスには2つのメソッドがありますが、呼び出されるproperties()メソッドは2番目のメソッドです。私は最初のもの(クラスローダーで定義されているもの)を呼びたいと思います。なぜそれがこのように起こるのですか?私は何をすべきか ?

+1

'c.properties()'のように見えると、 'mypackage.Compute $ Property'のオブジェクトを返します。 'c.properties()。properties()'を呼び出そうとしましたか? –

+1

Compute $ Propertiyにはproperties()メソッドがありません。 – guigolum

答えて

0

[OK]を取得しました。特定のフォルダに静的にクラスを生成する際に問題が発生しました。

私は既存のクラスを2回作成しないように解決しなければならなかったので、私は自分のパッケージプレフィックスで始まるクラスのみを解決しました。

これは静的生成ではうまくいきましたが、動的生成では以前に生成されたクラスをロードできませんでした。基本的には、私のクラスジェネレータが同じ名前の別のクラスを作成していたことを意味します。そのため、クラスローダはあるクラスを参照することもあり、別のクラスを参照することもあります。

私はこの汚れた混乱を修正しようとしています。

関連する問題