この記事では、動的プロキシクラスを最も内側のために、最も外側からの呼び出しを見て、どのようにCGLIBアプリケーション話せない中間ステップた後、日食デバッグの観点からプロキシクラスです。
直接コードでADO、
プロキシクラス:
パブリック クラスMySubject { 公共 空のdoSomething(){ System.err.printlnは、( "いくつかのことを実行してください!" ); } }
インターセプター:
パブリッククラスCgLibMethodInterceptorはMethodInterceptorの{実装 @Override パブリックオブジェクトインターセプト(オブジェクトターゲットメソッドメソッド、オブジェクト[]引数、MethodProxyプロキシが)のThrowable {スロー System.err.printlnを( "前に")。 オブジェクトの結果= proxy.invokeSuper(ターゲット、引数)。 System.err.println(+結果"後")。 結果を返します。 } }
動的プロキシCGLIB試験:
パブリッククラスCglibProxyWriter { パブリック静的無効メイン(文字列[] args){ するSystem.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY、 "D:\\ CGLIBクラス\\")。 MySubject被験者=(MySubject)Enhancer.create(MySubject.class、新しいCgLibMethodInterceptor())。 subject.doSomeThing(); } }
コールスタックからは、最も内側の呼び出しロジックに最外層をはっきりと見ることができます。
MySubject $$ $$ EnhancerByCGLIB 24226c3c(MySubject).doSomeThing()行:6
MySubject $$ $$ EnhancerByCGLIB 24226c3c.CGLIB $ doSomethingの$ 0()行:利用できません
MySubject $$ $$ EnhancerByCGLIB 24226c3c $$ $$ FastClassByCGLIB a7941ac2.invoke (INT、オブジェクト、オブジェクト[])ライン:利用できない
MethodProxy.invokeSuper(オブジェクト、オブジェクト[])ライン:244
CgLibMethodInterceptor.intercept(オブジェクト、メソッド、オブジェクト[]、MethodProxy)ライン:14
MySubject $$ EnhancerByCGLIB $$ 24226c3c .doSomeThing()行:利用できない
CglibProxyWriter.main(文字列[])ライン:16
MySubject $$ EnhancerByCGLIB $$ 24226c3c(MySubject).doSomeThing()行:6
MySubject $$ $$ EnhancerByCGLIB 24226c3c.CGLIB $ doSomethingの$ 0()行:利用できません
MySubject $$ EnhancerByCGLIB $$ 24226c3c $$ FastClassByCGLIB $$ a7941ac2.invoke(int型、オブジェクト、オブジェクト[])ライン:利用できません
MethodProxy.invokeSuper(オブジェクト、オブジェクト[])ライン:244
CgLibMethodInterceptor.intercept(オブジェクト、メソッド、オブジェクト[]、MethodProxy)ライン:14
MySubject $$ $$ EnhancerByCGLIB 24226c3c.doSomeThing()行:利用できません
CglibProxyWriter.main(文字列[])ライン:16
動的プロキシクラスを表示するために逆コンパイルツールを必要とする生成CGLIB、デバッグブレークポイントを追加することはできません日食、キャプチャは逆コンパイルコードを提供してきました。