動的プロキシ。つまり、限り、ライン上のインターフェースの実装など、独自のプロキシクラスを記述しないでください。
JDKおよびCGLIB:ダイナミックプロキシは、ここ2を説明します
最初のJDK
// インタフェースクラス のパブリック インタフェースブック{ 無効読む(文字列名); } // 1つの実装クラス パブリック クラスBookImpl道具帳{ @Override 公共 無効読む(文字列名){ システム。OUT .println(名); } } / / プロキシクラスにインターフェースを実装する パブリック クラスMyInvocationHandlerのInvocationHandlerの実装{ プライベートオブジェクト目標; 公衆MyInvocationHandler(オブジェクト・ターゲット){ この .TARGET = 目標; } @Override パブリックオブジェクトを呼び出し(オブジェクトo、方法方法、[]引数オブジェクト)がThrowableを{スロー リターンmethod.invoke(ターゲット、引数)。 } } // 测试方法 パブリッククラスメイン{ 公共 静的 ボイドメイン(文字列引数[]){ ブックbookImpl = 新しいBookImpl。 オブジェクトOBJ = たとえば、Proxy.newProxyInstance(bookImpl.getClass、 )ブック、getClss()。GETINTERFACE()、新しいmyInvocation }
CGLIB
// 一个实现类 パブリック クラスBookImpl { @Override 公共 ボイド読み取り(文字列名){ システム。アウト.println(名); } } // 实现一个一个代理类接口 パブリック クラスMyInsterceptorはMethodIntao {実装 プライベートオブジェクトのターゲットと、 公共MyInvocationHandler(オブジェクト・ターゲット){ この .TARGET = ターゲット。 } @Override パブリックオブジェクトインターセプト(オブジェクトOは、メソッドの方法は、MethodProxy myInterceを[]引数オブジェクト)がThrowableを{スロー リターンmethod.invoke(ターゲット、引数)。 } } // 测试方法 公開クラスメイン{ 公共の 静的な 無効メイン(文字列の引数[]){ BookImplブック = 新しいBookImpl(); エンハンサーエンハンサー = 新しいエンハンサー(); enhancer.setSuperClass(book.getClass)。 enhancer.setCallback(新しいMyInterceptor(書籍)) BookImplのB = (BookImpl)enhancer.create(); }