作用
- 代理对象可以做很多真实对象做不了的事
- 真实对象可以专注于做自己的事
与静态代理的区别
解决了代码量增大开发效率降低的问题
- 动态代理和静态代理角色一样
- 动态代理的代理类是动态生成的,不是直接写好的
- 动态代理分为
- 基于接口的动态代理(JDK动态代理)
- 基于类的动态代理(cglib)
- 基于Java字节码实现(Javasist)
示例
代理角色
/**
* 通用动态代理类,基于JDK的接口代理
*/
public class ProxyInvocationHandler implements InvocationHandler {
// 被代理的接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
// 生成得到代理类
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
// 处理代理实例,并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO SOMETHING
Object result = method.invoke(target, args);
// TODO SOMETHING
return result;
}
}
使用
// 真实角色
UserServiceImpl userService = new UserServiceImpl();
// 获得代理角色
ProxyInvocationHandler pih = new ProxyInvocationHandler();
// 设置代理对象
pih.setTarget(userService);
// 动态生成代理类
UserServiceImpl proxy = (UserServiceImpl)pih.getProxy();
// 接口方法
proxy.add()