2011-12-09 9 views
2
newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h); 

メソッドの呼び出しを指定された呼び出しハンドラにディスパッチする指定されたインターフェイスのプロキシクラスのインスタンスを返します。java.lang.reflect.Proxy.newProxyInstance()が返すオブジェクトを他のクラスに拡張する方法

このメソッドから返されたインスタンスをカプセル化する必要があります(たとえば、他のクラスにカプセル化する)ので、ほかのクラスも拡張する必要があります。したがって、最終クラスは1つのクラスを拡張し、指定されたインタフェースを実装します。拡張する

クラスがある:

public class IProxy { 

ObjectRef oref; 

public IProxy(ObjectRef oref) { 
    this.oref = oref; 
} 

} 

ので、プロセスがなければならない:

MyInterface() mi=(MyInterface) newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h); 

// some magic trick 

そして最後に、私はIProxyを拡張およびMIすべてのインタフェースを実装するクラスのインスタンスを持っていると思い実装しました。

+0

これはできません。なぜそのクラスを拡張すべきかについてもっと詳しく説明できますか?あなたが望むものを達成するための他の方法があるかもしれません。 – gkamal

答えて

2

newProxyInstanceから返されたオブジェクトがすでに他のクラスを継承しており、Javaの2つのクラスから継承できないため、実行できません。

InvocationHandlerインターフェイスを実装するクラスのインスタンス変数として、orefを保持する必要があります。あなたはInvocationHandlerのコンストラクタでorefを初期化、およびメソッドを介してアクセスorefへのインタフェースを提供します:

public interface IProxy { 
    ObjectRef getOref(); 
} 

あなたInvocationHandlerそのorefメンバーを返すことによってgetOrefの呼び出しに応答する必要があります。

+0

でも、クラスローダーを直接参照せずにIProxyのインターフェイスを実装するにはどうしたらいいですか? – jayunit100

+1

彼はJavaの意味でそのインタフェースを実装しません。むしろ、呼び出されるメソッドが 'IProxy'から' getOref'であることを検出すると、 'invoke(Object、Method、Object []) 'メソッドの実装の中で、そのディスパッチルーチンの一部として' getOref'の呼び出しに応答します。 。 – dasblinkenlight

関連する問題