动态代理在框架中的作用举足轻重,我们来看看两种比较常用的实现动态代理的方法:JDK动态代理和Cglib动态代理。
- JDK动态代理(要求被代理的对象必须实现某个接口)。很重要的两个类:
- Proxy:产生代理对象的类
- InvocationHandler:代理对象调用方法时会调用实现此类的子类的invoke方法
接口及其被代理的实现类:
public interface Action {
void execute();
}
/*被代理的类,必须实现一个接口*/
public class DefaultAction implements Action {
@Override
public void execute() {
System.out.println("DefaultAction执行execute方法");
}
}
JDK动态代理实现及测试代码:
public class ProxyTest {
public static void main(String[] args) {
Action target = new DefaultAction();
Action action = (Action) Proxy.newProxyInstance(
target.getClass().getClassLoader(), //定义代理类的类加载器
target.getClass().getInterfaces(), //代理类要实现的接口列表
new InvocationHandler() { //代理对象调用方法时会调用实现此类的子类
//的invoke方法,此处用匿名内部类来创建对象
@Override
/*
* proxy 代理实例
* method 调用的方法
* 方法的参数列表
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
System.out.println("===before===");
Object obj = method.invoke(target, args);
System.out.println("===after===");
return obj;
}
});
action.execute(); //代理对象执行方法,就会跳转到InvocationHandler执行invoke方法
}
}
- Cglib动态代理(可以不实现任何接口)。直接上代码吧。
被代理的类:
public class Action { //此类可以不实现任何接口
public void execute(){
System.out.println("Action====execute()");
}
}
代理工厂:
public class MyCglibProxyFactory implements MethodInterceptor{
private Action target; //被代理的实体,在构造器中传递进来
public MyCglibProxyFactory(Action target) {
this.target = target;
}
public Action getProxyInstance() {
Enhancer enhancer = new Enhancer(); //实例化一个Enhancer对象
enhancer.setSuperclass(Action.class); //创建子类
//设置回调接口Callback,因为此处实现的MethodInterceptor接口是Callback的子类,可以用this表示
enhancer.setCallback(this);
return (Action) enhancer.create(); //创建代理对象
}
@Override
/*
* obj 代理实例
* method 调用的方法
* args 方法参数列表
*
*/
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable
{
System.out.println("==before==");
Object result = method.invoke(target, args); //调用方法
System.out.println("==after==");
return result;
}
}
测试代码:
public class ProxyTest {
public static void main(String[] args) {
Action target=new Action();
MyCglibProxyFactory factory=new MyCglibProxyFactory(target);
Action proxy = factory.getProxyInstance(); //获得代理对象
proxy.execute(); //代理对象执行方法,就会跳转到MethodInterceptor执行intercept方法
}
}