动态代理理解:
举个例子吧,比如说你暗恋一个小美女,你给她写了个情书,你不好意思直接给她,就让我转给她。
我也暗恋这个小美女,我收到你的情书以后,我送你的情书之前跟小美女说你这个人人品差长得丑还没钱,然后再把你的情书给她。
动态代理就是这个过程。本来是你和小美女之间的关系,但中间让我转达一下,我在转达的前后可以干一些自己的事情。更具体的说,就是A调用B,但不直接调用,A通过调用C,C再调用B,C在调用B的前后可以做一些自己的事情,比如说打日志、权限验证等,这样就把业务代码与系统代码分开,同时减少了A和B之间的耦合。
动态代理的经典应用是Spring AOP。有兴趣可以学学。
AOP中使用的cglib
hello.java 被代理对象
package org.smart4j.framework.test;
/**
* Created by jack on 2017/6/27.
*/
public interface Hello {
void sayHello(String name);
}
HelloImp.java
package org.smart4j.framework.test;
/**
* Created by liangboqun on 2017/6/27.
*/
public class HelloImp implements Hello {
public void sayHello(String name) {
System.out.println("Hello ! " + name);
}
}
DynamicProxy.java 动态代理类
package org.smart4j.framework.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(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 after() {
System.out.println("proxy after");
}
private void before() {
System.out.println("proxy before");
}
public <T> T getProxy(){
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
}
测试类:
package org.smart4j.framework.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* Created by fumc on 2017/6/27.
*/
public class MainTest1 {
public static void main(String[] args) {
System.out.println("================");
System.out.println("====动态代理====");
Hello helloDynamic =new HelloImp();
DynamicProxy dynamicProxy=new DynamicProxy(helloDynamic);
Hello hello = (Hello)Proxy.newProxyInstance(helloDynamic.getClass().getClassLoader(), helloDynamic.getClass().getInterfaces(), dynamicProxy);
hello.sayHello("付萌好");
helloDynamic.sayHello("mc good");
System.out.println("====动态代理====");
}
}
返回结果
================
====动态代理====
proxy before
Hello ! 付萌好
proxy after
Hello ! mc good
====动态代理====
网友评论