まず、プロキシモードは何ですか?そして、役割があるのでしょうか?
プロキシモードでは、我々は、外の世界への機能のインタフェースを提供するために、既存のオブジェクトを持つオブジェクトを作成します。そして、メソッドへのアクセスを制御することで、これはクラスである、この上の外国人のエージェント固有の情報を隠蔽するための良いプロキシクラスです。他のオブジェクトへのオブジェクトへのアクセスを制御するためのプロキシを提供します。端的に言えば:アクセスが操作プロキシクラスの前と後に行われた拡張の数に直接アクセスを実現するために、プロキシクラスを介してです。
区別、およびアダプタモード:メインアダプタモードの変更は、オブジェクトのインターフェイスを企図が、インタフェース・モード・プロキシプロキシクラスを変更することはできません。
2とデコレータパターンとの間の差:強化用デコレータ、プロキシモードが制御されます。
静的プロキシの実装
1、プロキシクラスとISOURCEインターフェースプロキシクラスが一緒に実現しています。
パブリックインターフェイスISOURCE {
公共ボイド方法();
}
2、プロキシクラス
ISOURCE {クラスSourceable実装公共
@Override
ます。public voidメソッド(){
System.out.printlnは( "私は、プロキシクラスでした!");
}
}
図3に示すように、プロキシクラス:オブジェクトインスタンスプロキシクラスを保持します。
パブリッククラスプロキシは、ISOURCE {実装
プライベートSourceable源と、
パブリックプロキシ(){
this.source =新しいSourceable()。
}
@Override
公共ボイド方法(){
前();
source.method();
()の後に、
}
(){前プライベートボイド
のSystem.out.println( "AA")。
}
(){後プライベートボイド
のSystem.out.println( "BB")。
}
}
4、試験クラス
{クラスProxyTest公共
のpublic static無効メイン(文字列[] args){
インターフェースを介して、プロキシクラスがインスタンス化される//、
ISOURCEプロキシソース新しい新=();
//プロキシクラスのメソッド呼び出し
source.methodを();
}
}
二、JDKの動的プロキシ
1,1,2は、上記の手順。
2、演技クラス
パブリッククラスSourceProxyはのInvocationHandler {実装
//目标对象
プライベートオブジェクトのターゲットを、
公共SourceProxy(オブジェクト・ターゲット){
this.target =ターゲット。
}
@Override
パブリックオブジェクトを呼び出したThrowable {スロー(オブジェクト・プロキシは、メソッドの方法は、[]引数オブジェクト)
( "AA")のSystem.out.printlnと、
オブジェクトrs = method.invoke(ターゲット、引数)。
System.out.println( "BB");
RSを返します。
}
}
3、テストクラス
パブリック静的無効メイン(文字列[] args){
ISOURCEソース=新しいSource()。
SourceProxy myInvocationHandler =新しいSourceProxy(ソース)。
//代理对象
ISOURCE proxySource =(ISOURCE)たとえば、Proxy.newProxyInstanceローダ(ClassLoader.getSystemClassLoader()、新しいクラス[] {} ISource.class、myInvocationHandler)。
proxySource.method();
}
三、CGLIBダイナミックプロキシー(パケットCGLIB-2.2.3.jar必要とCGLIB-NODEP-2.2.2.jar; asm.jar)
1、プロキシクラスのソース
パブリック クラス ソース{
//をプロキシすることができ
公共 のボイド (食べます){
。システムOUT .println( "私は、プロキシクラスAAでした");
}
//最後の方法は、単語クラスのオーバーライドを生成されることはありません
公共の 最終 ボイド の仕事(){
。システムOUT .println( "私はプロキシクラスのBBました");
}
//プライベートメソッドは、単語クラスのオーバーライドで生成されることはありません
プライベート ボイド プレイ() {
。システムOUT .println( "私はプロキシクラスccでした");
}
}
2、演技クラス
パブリック クラス CglibProxyは実装 MethodInterceptorのを{
プライベート オブジェクトのターゲット。
公共 CglibProxy(オブジェクト・ターゲット){
この .TARGET =ターゲット。
}
@オーバーライド
パブリック オブジェクトインターセプト(オブジェクトo、メソッドのメソッド、オブジェクト[]オブジェクト、MethodProxy methodProxy)がスロー のThrowableを{
システム。アウト .println( "AA");
オブジェクトの結果= method.invoke(ターゲットオブジェクト)。
システム。アウト .println( "BB");
戻り値の 結果;
}
パブリック 静的 オブジェクトgetProxy(オブジェクトターゲット){
エンハンサーエンハンサー= 新しい エンハンサー();
//セットは、プロキシオブジェクトが必要です
enhancer.setSuperclass(target.getClass())。
//設定弁護士
enhancer.setCallback(新しい CglibProxy(ターゲット));
リターン enhancer.create();
}
}
3、テストクラス
パブリック クラスの テスト{
パブリック 静的 ボイド メイン(文字列[]引数){
//生成CGLIBの プロキシクラスを
ソースengineerProxy =(出典)CglibProxy。getProxy(新しい ソース());
//関連するメソッドを呼び出します
engineerProxy.eat();
}
}