Java Dynamic Proxyクラスは、java.lang.Refflectパッケージの下にあり、一般的には主に次の2つのクラスが含まれます。
(1)InvocationHandler:このインターフェイスで定義されているメソッドは1つだけです
パブリックオブジェクトが呼び出される(オブジェクトOBJ、メソッドメソッド、オブジェクト[] args)
実際の使用では、最初のパラメーターOBJは一般にプロキシクラスを指します。メソッドは、上記の例の要求()などのプロキシメソッドです。Argsはメソッドのパラメーター配列です。 この抽象的なメソッドは、プロキシクラスで動的に実装されています。
(2)プロキシ:このクラスは動的プロキシクラスであり、その機能は上記の例のプロキシストブジェクトに似ています。これには主に次の内容が保護されたプロキシ(InvocationHandler H)が含まれています。内部h。
静的クラスGetProxyclass(クラスローダーローダー、クラス[]インターフェイス)
ローダーがクラスローダーであり、インターフェイスが実際のクラスが所有するすべてのインターフェイスの配列であるプロキシクラスを取得します。
静的オブジェクトnewProxyInstance(classloaderローダー、クラス[]インターフェイス、招きハンドラーh)
プロキシクラスのインスタンスを返すことができます。
いわゆるダイナミックプロキシはクラスです。それは、実行時に生成されるクラスです。インターフェイスのセットを提供する必要があります。もちろん、これらのインターフェイスのいずれかとしてクラスのインスタンスを使用できます。もちろん、このダイナミックプロキシは実際にはプロキシであり、インスタンスを生成する場合は、実際の作業を引き継ぐ必要があります。
動的プロキシクラスを使用する場合、InvocationHandlerインターフェイスを実装する必要があります。
プログラムsubject.javaを参照してください
プログラムrealsubject.javaを参照してください
プログラムdynamicsubject.javaを参照してください
プログラムclient.javaを参照してください
コードコピーは次のとおりです。
パッケージcom.langsin.dynamicproxy;
//要約の役割(以前は抽象クラスでしたが、ここでインターフェイスに変更する必要があります):
パブリックインターフェイスの件名
{
抽象的なpublic void request();
}
コードコピーは次のとおりです。
パッケージcom.langsin.dynamicproxy;
//特定の役割
パブリッククラスの実質被験者は主題を実装します
{
public RealSubject()
{
}
public void request()
{
System.out.println( "Real Subject。");
}
}
コードコピーは次のとおりです。
パッケージcom.langsin.dynamicproxy;
java.lang.reflt.invocationhandlerをインポートします。
java.lang.reflt.methodをインポートします。
//プロキシプロセッサ
/**
*プロキシクラスの内部プロパティは、使用する場合、クラスDynamicSubject(オブジェクトOBJ)のコンストラクターを介して値を割り当てられます。
*さらに、Invokeメソッドは、このクラスのMethod.Invoke(sub、args)にも実装されています。
*実際、メソッドパラメーターサブによって実行されるメソッドを呼び出すことです。
* argsは、プロキシオブジェクトの対応する操作を実行するために必要なパラメーターです。
*動的プロキシクラスを通じて、電話の前後に関連する操作を実行できます
*/
Public Class DynamicSubjectは、InvocationHandlerを実装しています
{
プライベートオブジェクトサブ;
public dynamicsubject()
{
}
public dynamicsubject(オブジェクトobj)
{
sub = obj;
}
パブリックオブジェクトの呼び出し(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args)スロー可能
{
system.out.println( "呼び出す前に" +メソッド);
method.invoke(sub、args);
system.out.println( "" + methodを呼び出した後);
nullを返します。
}
}
コードコピーは次のとおりです。
パッケージcom.langsin.dynamicproxy;
java.lang.reflt.invocationhandlerをインポートします。
java.lang.reflt.proxyをインポートします。
//クライアント
パブリッククラスクライアント
{
Static Public void Main(String [] args)スローがスロー可能
{
RealSubject rs = new RealSubject();
InvocationHandler ds = new DynamicSubject(rs);
class <?> cls = rs.getClass();
//以下は1回限りの世代エージェントです
件名=(件名)proxy.newproxyinstance(
cls.getClassLoader()、cls.getInterfaces()、ds);
subject.request();
}
}
例2:
コードコピーは次のとおりです。
パッケージcom.langsin.dynamicproxy;
java.lang.reflt.invocationhandlerをインポートします。
java.lang.reflt.methodをインポートします。
java.lang.reflt.proxyをインポートします。
java.util.listをインポートします。
java.util.vectorをインポートします。
パブリッククラスVectorProxyはInvocationHandlerを実装します
{
プライベートオブジェクトproxyobj;
public vectorproxy(オブジェクトobj){
proxyobj = obj;
}
public static Object Factory(Object obj){
class <?> cls = obj.getclass();
proxy.newproxyinstance(cls.getClassLoader()、cls.getInterfaces()、new VectorProxy(OBJ));
}
パブリックオブジェクトの呼び出し(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args)スロー可能{
system.out.println( "呼び出す前に" +メソッド);
if(args!= null){
for(int i = 0; i <args.length; i ++){
System.out.println(args [i] + "");
}
}
オブジェクトオブジェクト= method.invoke(proxyobj、args);
system.out.println( "" + methodを呼び出した後);
オブジェクトを返します。
}
@suppresswarnings( "unchecked")
public static void main(string [] args){
List <String> V =(List <String>)Factory(new Vector <String>(10));
v.add( "new");
v.add( "York");
System.out.println(v);
V.Remove(0);
System.out.println(v);
}
}
例3。
コードコピーは次のとおりです。
パッケージcom.langsin.dynamicproxy;
パブリックインターフェイスfoo {
void doaction();
}
パッケージcom.langsin.dynamicproxy;
パブリッククラスfooimplを実装するfoo {
public fooimpl(){
}
public void doaction(){
system.out.println( "in fooimp1.doaction()");
}
}
パッケージcom.langsin.dynamicproxy;
パブリッククラスfooimpl2はfoo {
public fooimpl2(){
}
public void doaction(){
system.out.println( "in fooimp2.doaction()");
}
}
パッケージcom.langsin.dynamicproxy;
java.lang.reflt.invocationhandlerをインポートします。
java.lang.reflt.methodをインポートします。
パブリッククラスCommonInvocationHandlerはInvocationHandlerを実装しています{
//オブジェクトの動的実行、コールバックを必要とするオブジェクト
プライベートオブジェクトターゲット。
//サポートコンストラクターインジェクション
public commonInvocationHandler(){
}
//サポートコンストラクターインジェクション
public commonInvocationHandler(オブジェクトターゲット){
Setarget(ターゲット);
}
/**
*
*セッターメソッドを使用して注入します
*
* @paramターゲット
*
*/
public void settarget(オブジェクトターゲット){
this.target =ターゲット;
}
/**
*
*プロキシで指定されたメソッドを呼び出し、パラメーターリストargsで渡す
*
* @Param Proxy
*メソッドに対応するプロキシインターフェイスの定義など、プロキシクラスのタイプ
*
* @paramメソッド
*プロキシの方法
*
* @param args
*プロキシメソッドを呼び出すパラメーター
*
* @戻る
*
* @Throws Java.lang.Throwable
*
*/
パブリックオブジェクトの呼び出し(オブジェクトプロキシ、メソッドメソッド、オブジェクト[] args)スロー可能{
return method.invoke(ターゲット、args);
}
}
パッケージcom.langsin.dynamicproxy;
java.lang.reflt.proxyをインポートします。
パブリッククラスのデモ{
public static void main(string [] args){
//1。一般的な動的プロキシ実装
CommonInvocationHandler handler = new commonInvocationHandler();
foo f;
// 2。インターフェイスの実装1
handler.settarget(new fooimpl());
//メソッドパラメーター説明:プロキシクラス、プロキシクラスの実装リスト、プロキシクラスプロセッサ
//プロキシクラスのプロキシクラス、インターフェイスメソッド、およびプロセッサを関連付けます。プロキシクラスのインターフェイスメソッドが呼び出されます。
//プロキシクラスが指定されたインターフェイスリストを実装していない場合、違法なパラメーター例外がスローされます
f =(foo)proxy.newproxyinstance(foo.class.getClassLoader()、
新しいクラス[] {foo.class}、
ハンドラ);
f.doaction();
// 3。インターフェイスの実装2
handler.settarget(new fooimpl2());
f =(foo)proxy.newproxyinstance(foo.class.getClassLoader()、
新しいクラス[] {foo.class}、
ハンドラ);
f.doaction();
}
}
私は文学的な才能が限られているので、ほとんどのコンテンツはコードです ^_ ^