java动态代理在Spring的AOP中可谓是被应用到了极致,一直不是很清楚,今天想复习一下设计模式,刚好看到动态代理一下就把我的思绪拉回到看AOP源码的时光了,说实话动态代理我用的太少了,于是今天小总结一下,来看看。
引入如下场景:房东想租房子,但是他只想租不想管其余的琐事,于是他找中介,把房子托给他,这个中介就是一个代理者。
静态代理,十分简单:就是代理者内部聚合一个接口,这个接口是房东和中介共有的,这样就实现了静态的代理,这里就不再赘述了,代码贴出来看一眼就懂了。
// 被代理类和代理类共同的操作
interface Action {
default void doOther() {
};
void display();
}
// 被代理类【房东】
class Host implements Action {
@Override
public void display() {
System.out.println("我是房东,我只想租房子,啥也不想管");
}
}
// 代理类【中介】
class HostProxy implements Action {
private Action action;
public HostProxy() {
action = new Action() {
@Override
public void display() {
System.out.println("do nothing...");
}
};
}
public HostProxy(Action action) {
this.action = action;
}
@Override
public void display() {
PostProcessorsBeforeAction();
action.display();
PostProcessorsAfterAction();
}
private void PostProcessorsBeforeAction() {
System.out.println("我来代理你做吧");
}
private void PostProcessorsAfterAction() {
System.out.println("代理执行后序到结束");
}
}
// 动态代理雏形...
Action host = new Host();
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理之前干事情");
host.display();
System.out.println("动态代理完成");
return null;
}
};
Action actionProxy = (Action) Proxy.newProxyInstance(Action.class.getClassLoader(), new Class[]{Action.class}, invocationHandler);
actionProxy.display();
// 自己写一下动态代理
class DynamicProxy<T> {
public T getProxy(Class<?> clazz, T obj, Object... args){
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("动态代理之前干的...事情");
// 原方法调用(这里只测试有一个方法,我取出第一个就好)
Method[] methods = obj.getClass().getMethods();
methods[0].invoke(obj, args);
System.out.println("动态代理完成啦...");
return null;
}
};
T proxyInstance = (T) Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, invocationHandler);
return proxyInstance;
}
}
// 动态代理
DynamicProxy<Action> dynamicProxy = new DynamicProxy();
Action proxy = dynamicProxy.getProxy(Action.class, new Host());
proxy.display();
一篇很好的文章,值的看看:https://www.cnblogs.com/gonjan-blog/p/6685611.html
原文:https://www.cnblogs.com/ningxinjie/p/14356058.html