Java静的エージェントと動的エージェントの概要
6390 ワード
スタティツクエージェント
第1のインプリメンテーション(インタフェースベース):
1)インタフェース
2』ターゲットクラス、少なくとも1つのインタフェースを実現する
3』エージェントクラス(ターゲットクラスと同じインタフェースを実現し、機能が一致することを保証する)
3)テスト
2つ目の実装(ターゲットクラスベース):
1>ターゲットクラス
2>エージェントクラス(ターゲットクラスを継承することで、機能が一致することを保証)
3>テスト
ダイナミックエージェント
動的エージェントのエージェントクラスはプログラム実行中に動的に生成され,JDK動的エージェントとCGLib動的エージェントの2つの実装もある.
1』JDK動的エージェント(インタフェースに基づいて実現し、目標クラスと同じインタフェースを実現し、それによって機能が一致することを保証する)
2』CGLibダイナミックエージェント(ターゲットクラスに基づいて、ターゲットクラスを継承することで機能が一致することを保証する)は、cglib-3.2.4を導入する必要がある.JArパッケージ
pom.xml
1)対象クラス
2)テスト
以上、Java静的エージェントと動的エージェントを紹介しました.
第1のインプリメンテーション(インタフェースベース):
1)インタフェース
public interface Hello {
void say(String msg);
}
2』ターゲットクラス、少なくとも1つのインタフェースを実現する
public class HelloImpl implements Hello {
public void say(String msg) {
System.out.println("Hi,"+msg);
}
}
3』エージェントクラス(ターゲットクラスと同じインタフェースを実現し、機能が一致することを保証する)
public class HelloProxy implements Hello{
private Hello hello;
public HelloProxy(Hello hello){
this.hello = hello;
}
public void say(String msg){
before();
hello.say(msg);
after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
3)テスト
/**
* @Author LZHL
* @Create 2017-02-19 10:26
* @Description
*/
public class Main {
public static void main(String[] args) throws Exception {
HelloImpl target = new HelloImpl();
HelloProxy proxy = new HelloProxy(target);
proxy.say("LZHL");
}
}
2つ目の実装(ターゲットクラスベース):
1>ターゲットクラス
public class HelloTarget {
public void sayHello(String name){
System.out.println("Hi,"+name);
}
}
2>エージェントクラス(ターゲットクラスを継承することで、機能が一致することを保証)
public class HelloProxy extends HelloTarget{
private HelloTarget target;
public HelloProxy(HelloTarget target){
this.target = target;
}
@Override
public void sayHello(String name) {
this.before();
target.sayHello(name);
this.after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
3>テスト
public class Main {
public static void main(String[] args) throws Exception {
HelloTarget target = new HelloTarget();
HelloProxy proxy= new HelloProxy(target);
proxy.sayHello("LZHL");
}
}
ダイナミックエージェント
動的エージェントのエージェントクラスはプログラム実行中に動的に生成され,JDK動的エージェントとCGLib動的エージェントの2つの実装もある.
1』JDK動的エージェント(インタフェースに基づいて実現し、目標クラスと同じインタフェースを実現し、それによって機能が一致することを保証する)
/**
* @Author LZHL
* @Create 2017-02-19 12:46
* @Description
*/
public class Main {
public static void main(String[] args){
final HelloImpl target = new HelloImpl();
Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
/*
* proxy:
* method:
* args:
* return:
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object retValue = method.invoke(target, args);
System.out.println("after");
return retValue;
}
});
Hello proxy = (Hello) proxyInstance;
proxy.say("LYX");
// InvocationHandler , , ,
class JDKProxy implements InvocationHandler {
private Object target;
public JDKProxy(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target, args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
InvocationHandler ih = new JDKProxy(target);
Object proxyInstance2 = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih);
Hello proxy2 = (Hello) proxyInstance2;
proxy2.say("LZHL");
}
}
2』CGLibダイナミックエージェント(ターゲットクラスに基づいて、ターゲットクラスを継承することで機能が一致することを保証する)は、cglib-3.2.4を導入する必要がある.JArパッケージ
pom.xml
cglib
cglib
3.2.4
1)対象クラス
public class Hi {
public void sayHi(String msg){
System.out.println("Hi,"+msg);
}
}
2)テスト
/**
* @Author LZHL
* @Create 2017-02-19 13:19
* @Description
*/
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
//
enhancer.setSuperclass(Hi.class);
//
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
Object retValue = methodProxy.invokeSuper(target, args);
System.out.println("after");
return retValue;
}
});
Object proxy = enhancer.create();
Hi hi = (Hi) proxy;
hi.sayHi("LXY");
// MethodInterceptor , , ,
class CGLibProxy implements MethodInterceptor {
public T getProxy(Class clazz){
return (T) Enhancer.create(clazz, this);
}
public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
Object result = proxy.invokeSuper(target, args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
CGLibProxy cgLibProxy = new CGLibProxy();
Hi hi2 = cgLibProxy.getProxy(Hi.class);
hi2.sayHi("LZHL");
}
}
以上、Java静的エージェントと動的エージェントを紹介しました.