2010-12-04 10 views
0

私はASMを使用して私のクラスのインスツルメントと私は最後の行にClassCastExceptionが取得ただし、このリフレクションなしでバイト配列のクラスを使用しますか?

public class MyClassLoader extends ClassLoader { 
... 
    byte[] classBytes = ... //the class is of type com.mypackage.Test 
    Class clazz = defineClass("com.mypackage.Test", classBytes, 0, classBytes.length); 
    resolveClass(clazz); 
    com.mypackage.Test test =(com.mypackage.Test) clazz.newInstance(); 

のようにそれを処理してきました:

java.lang.ClassCastException: com.mypackage.Test cannot be cast to com.mypackage.Test 

回避策は、リフレクションを使用することです:

​​

間違ったクラスローダーなどを使用していますか?

答えて

5

Class.newInstanceは、反射的な呼び出しです。

通常、これらの状況では、クラスローダーを既存のコードをロードしたクラスローダーの子にする必要があります。実装クラスがコードのクラスローダーからインタフェースを実装するようにしてください。 Class.asSubclassを使用して、Classがご使用のインターフェイスの既知のサブタイプであるようにしてください。実装クラスのインスタンスをClass.getConstructor.newInstanceから構築します。

この手法を使用すると、リフレクションを使用してメソッドを選択する必要はありませんが、引数なしのコンストラクタが必要です。

+0

+1、優れた技術。 –

関連する問題