[Java]エージェントモードによる動的エージェントの実装
2655 ワード
文書ディレクトリプロキシモード 一般業務インタフェース トラフィックインタフェース実装クラス エージェントクラス(仲介クラス) 実装クラス(呼び出し) プロキシモード
エージェントモードの最大の特徴はエージェントクラスと実際の業務クラスが同じインタフェース(または同じ親クラスを継承)を実現することであり、エージェントオブジェクトは実際のオブジェクトの参照を持ち、外部呼び出し時にエージェントオブジェクトを操作するが、エージェントオブジェクトの内部実装では実際のオブジェクトの操作Javaダイナミックエージェントを呼び出すことも実際には内部が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");
}
}