パッケージプロキシ。 パブリックインターフェイスヒト{ 公共ボイドラン(); 公共ボイドが食べ(); }
定義されたインタフェース
インターフェイスクラスの定義を完了します
パッケージプロキシ。 公共のクラスの先生は、人間の{実装 @Override ます。public void実行(){ // TODO自動生成されたメソッドスタブを するSystem.out.println( "走"); } @Override 公共ボイドは(){食べる // TODO自動生成方法スタブ のSystem.out.println( "吃を"); } }
メイン関数の定義を完了するには
プロキシパッケージ; インポートjava.lang.reflect.InvocationHandler; インポートjava.lang.reflect.Methodオブジェクト、 インポートjava.lang.reflect.Proxyの、 インポートorg.junit.Test; パブリッククラスデモ{ 公共の静的な無効メイン(文字列[]引数){ 教師教師=();新しい新規のteacher1 ヒトteacher2 =(ヒト)たとえば、Proxy.newProxyInstance(teacher.class.getClassLoader()(新しい新規のInvocationHandlerの、teacher.class.getInterfaces()){ プロキシオブジェクト/ *呼び出し表さを実行オブジェクト引数メソッド応答パラメータ・オブジェクトのメソッド* /方法 @Override パブリック呼び出しオブジェクト(プロキシ、メソッドをオブジェクト、メソッド、[]引数オブジェクト)のThrowable {スロー するSystem.out.println(「何かをする前に」); IF(方法。 getName()。等号( "食べる ")){/ * *決意方法/ System.out.println(「食べる前に階段を下り走った」); } ターゲットオブジェクトを実行する//メソッド オブジェクトinvokea = Method.invoke(新しい新しい先生を()、引数); System.out.printlnは( "何かをした後に"); // TODO自動生成方法、スタブ 戻りinvokea; } }) ; teacher1.eat(); teacher1.run(); のSystem.out.println( "教師1完了"); teacher2.eat(); teacher1.run(); } }
結果
食べる
離れて
1完全な教師を
何かをする前に、
食べる前に手順を走った
食べ
た後に何かを
歩きます
動的プロキシ
あなたはそれを事前に定義する必要がなく、実行時にクラスを変更する方法にカットすることができます。