java动态代理JDK实现
步骤
定义接口
public interface Hello {
void sayHi();
}
目标类(实现上面的接口)
public class HelloImpl implements Hello{
public void sayHi() {
System.out.println("睡你麻痹起来嗨");
}
}
实际处理类
实现InvocationHandler接口
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;
}
public void before(){
System.out.println("不想起床");
}
public void after(){
System.out.println("就算起来了也嗨不起来");
}
}
JDK的Proxy类创建代理类
public static void main(String[] args){
Hello hello=new HelloImpl();
DynamicProxy dynamicProxy=new DynamicProxy(hello);
Hello helloProxy=(Hello) Proxy.newProxyInstance(hello.getClass().getClassLoader(),hello.getClass().getInterfaces(),dynamicProxy);
helloProxy.sayHi();
}
优化
可以看到Proxy动态代理创建过程中需要的参数:hello,dynamicProxy在DynamicProxy类中都有,可以做如下简化。
DynamicProxy
public <T> T getProxy(){
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
优点
如果一个接口有多个实现类,对这些实现类创建代理类只需要这一个DynamicProxy就好了,不需要做其他的修改。如果需要在方法的前后做不同的事情,只用定义不同的DynamicProxy,里面的before和after方法完成相应的功能就好了。就算接口发生了变化,代理类也不用变化。
缺点
如果要代理没有实现任何接口的类就不行了。