一:什么是动态代理?
代理类在程序运行前不存在、运行时由程序动态生成的代理方式称为动态代理。
(区别于编译时就确定了被代理的类是哪一个,那么就可以直接使用静态代理)
二:作用:
在运行时刻动态生成代理类,可以方便对代理类的函数做统一或特殊处理而不用像静态代理方式那样需要修改每个函数。
代理转发的过程自动化了,实现自动化转化。
代理类的代码逻辑和具体业务逻辑解耦,与业务无关。
三:如何实现:
1.新建委托类。
public interface Delegation {
void delegationMethod1();
void delegationMethod2();
void delegationMethod3();
}
public class DelegationImpl implements Delegation {
@Override
public void delegationMethod1() {
//do something
}
@Override
public void delegationMethod2() {
//do something
}
@Override
public void delegationMethod3() {
//do something
}
}
2.实现InvocationHandler
接口;
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler() {}
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = method.invoke(target, args);
return obj;
}
}
target
属性表示委托类对象。
InvocationHandler
是负责连接代理类和委托类的中间类必须实现的接口。
3.通过Proxy
类新建代理类对象。
MyInvocationHandler myHandler = new MyInvocationHandler(new DelegationImpl());
Delegation delegation = (Delegation) (Proxy.newProxyInstance(Delegation.class.getClassLoader(), new Class[]{Delegation.class},
myHandler));
// call method of proxy instance
delegation.delegationMethod1();
delegation.delegationMethod3();
通过Proxy.newProxyInstance(…)
函数新建了一个代理对象,实际代理类就是在这时候动态生成的。
我们调用该代理对象的函数就会调用到MyInvocationHandler的invoke
函数,
而invoke
函数实现中调用委托类对象new DelegationImpl()
相应的 method。
Proxy.newProxyInstance 创建的代理对象是在jvm运行时动态生成的一个对象,它并不是我们的InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以$开头,proxy为中,最后一个数字表示对象的标号。