[Java]エージェントモードによる動的エージェントの実装


文書ディレクトリ
  • プロキシモード
  • 一般業務インタフェース
  • トラフィックインタフェース実装クラス
  • エージェントクラス(仲介クラス)
  • 実装クラス(呼び出し)
  • プロキシモード
    エージェントモードの最大の特徴はエージェントクラスと実際の業務クラスが同じインタフェース(または同じ親クラスを継承)を実現することであり、エージェントオブジェクトは実際のオブジェクトの参照を持ち、外部呼び出し時にエージェントオブジェクトを操作するが、エージェントオブジェクトの内部実装では実際のオブジェクトの操作Javaダイナミックエージェントを呼び出すことも実際には内部がJava反射メカニズムによって実現される.すなわち、既知のオブジェクトが、実行時にメソッドを動的に呼び出し、呼び出しの前後で対応する処理を行う.
    一般的なビジネスインタフェース
    package com.pratise.study.proxy;
    
    public interface Subject
    {
        public void hello(String str);
    }
    

    ビジネスインタフェース実装クラス
    package com.pratise.study.proxy;
    
    public class RealSubject implements Subject
    {
        @Override
        public void hello(String str)
        {
            System.out.println("hello: " + str);
    
        }
    }
    

    エージェントクラス(仲介クラス)
    package com.pratise.study.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * @author cpgroup_lxw
     * @version V1.0
     * @Title: StudyProxy
     * @Package com.pratise.study.proxy
     * @Description:       
     * @date 2019-2-12 16:06
     */
    public class StudyProxy implements InvocationHandler {
    
    	private Object subject;
    
    	public StudyProxy(Object subject) {
    		this.subject = subject;
    	}
    
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		System.out.println("    ");
    		method.invoke(subject,args);
    		System.out.println("    ");
    		return null;
    	}
    }
    

    インプリメンテーションクラス
    package proxy;
    
    import com.pratise.study.proxy.RealSubject;
    import com.pratise.study.proxy.StudyProxy;
    import com.pratise.study.proxy.Subject;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    /**
     * @author cpgroup_lxw
     * @version V1.0
     * @Title: StudyProxyTest
     * @Package proxy
     * @Description:         
     * @date 2019-2-12 16:14
     */
    public class StudyProxyTest {
    	public static void main(String[] args) {
    		//           
    		RealSubject realSubject = new RealSubject();
    		InvocationHandler handler = new StudyProxy(realSubject);
    		System.out.println(handler.getClass());
    		/*
    		 *   Proxy newProxyInstance            ,          
    		 *       handler.getClass().getClassLoader() ,      handler    ClassLoader            
    		 *      realSubject.getClass().getInterfaces(),                         ,             ,                
    		 *      handler,                    InvocationHandler      
    		 */
    		Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler);
    		System.out.println(subject.getClass().getName());
    		subject.hello("world");
    	}
    }