5

Javassist を使用してクラスを作成します。また、テスト スイートでは、2 番目のテストが同じクラスを作成しようとするとpool.makeClass( ... )、クラスが凍結されている (つまり、toClass().

これを克服する方法は何ですか?理想的には、最初のテストで何らかの方法でクラスを削除する必要があります-おそらくクラスローダーからアンロードします-しかし、 JLSで読んだように、アンロード操作は信頼できません。

したがって、おそらく回避策は、クラス作成コードが存在するかどうかをチェックインし、存在する場合は、defrost()すべてのメンバーなどを削除して再作成することです。

他のアイデアはありますか?

または、Javassist を介してクラスを削除する信頼できる方法はありますか?

4

2 に答える 2

4

から単一のクラスをアンロードすることはできませんClassLoader。クラスとそのクラスが到達不能になった場合、クラスはアンロードされる可能性がありますClassLoaderが、すべてのクラスがそのローダーを参照するため、このローダーによってロードされたすべてのクラスも到達不能になったに違いないことを意味します。

ただし、別の を使用してクラスを (再) 作成できますClassLoader。正式には、同じ名前 (およびおそらく同じバイト コード) を持つ別のクラスです。テスト ケース内で実行されたコードがヒープに参照を残さない場合、ClassLoaderおよびそのクラスがテスト後に収集される可能性があります。

于 2013-11-27T08:27:18.273 に答える
0

同じ問題が発生しました。この方法で解決しました。テストケースに適用できない場合があります。

CtClass をクラスのプライベートな静的変数にします。

CtClass が既に構築されているかどうかを確認するメソッドを作成します。CtClass が構築されていない場合は、それを構築するメソッドを呼び出します。それ以外の場合は、その CtClass を返します。

すべてのテストで新しいメソッドを使用するようにします。

したがって、N Test がある場合、最初の 1 つだけが CtClass の構築を試み、残りは静的な CtClass 変数を持ちます。

于 2014-06-18T19:18:30.773 に答える