JDKが動的エージェントを実装する例-proxy

2161 ワード

public interface Target {

    public void doSomething();

}

 
public class TargetImpl implements Target {

    @Override
    public void doSomething() {
        
        System.out.println("doSomething  ----");
        
    }

}

 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationhandler implements InvocationHandler {

    private Target target;
    
    public MyInvocationhandler(Target target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        
        System.out.println(" -----");
        
        Object result = method.invoke(target, args);
        
        System.out.println(" -----");
        
        return result;
    }

}

 
 
 
 
    public static void main(String[] args) {

        Target target = (Target) Proxy.newProxyInstance(TargetImpl.class.getClassLoader(),
            TargetImpl.class.getInterfaces(), new MyInvocationhandler(new TargetImpl()));
        
        target.doSomething();

    }

 
 
出力結果:
 
処理開始---doSomethingメソッド実行開始---処理完了---
 
 
動的エージェントの原理:動的エージェントと普通のエージェントモードの違いは、動的エージェントの中のエージェントクラスがjavaであることである.lang.reflect.Proxyクラスは実行期間中にインタフェース定義に基づいてJava反射機能を用いて動的に生成される.とjava.lang.reflect.InvocationHandlerを組み合わせることで,既存のクラスのメソッド実装を強化することができる.図2のように、図中のカスタムHandlerはInvocationHandlerインタフェースを実装し、カスタムHandlerがインスタンス化されると、インプリメンテーションクラスがカスタムHandlerオブジェクトに転送される.カスタムHandlerはinvokeメソッドを実装する必要があり、このメソッドはJava反射呼び出し実装クラスの実装メソッドを使用することができ、同時にもちろん他の機能を実装することができ、例えば実装クラスメソッドを呼び出す前後にLogを加えることができる.一方,ProxyクラスはHandlerとエージェントを必要とするインタフェースに基づいてインタフェース実装クラスのオブジェクトを動的に生成する.この動的に生成された実装クラスをユーザが呼び出すと,実際にはカスタムHandlerのinvokeメソッドが呼び出される.