静态代理和动态代理
Posted westlife-11358
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态代理和动态代理相关的知识,希望对你有一定的参考价值。
根据我自己的的理解:
静态代理是实现抽象接口,在代理汇中获取代理对象的对象。需要一一去重写抽象类中的方法。
动态代理使用的是反射,需要我们传入被代理类,并默认实现所有的目标方法,通过invoke中方法反射获取menthod对象方法名称即可实现。
public class HuangNiuHandle implements InvocationHandler【1】
private Object proxyTarget;
public Object getProxyInstance(Object target)
this.proxyTarget = target;
return Proxy.newProxyInstance【2】(proxyTarget.getClass().getClassLoader()【获取代理类实例对象】, proxyTarget.getClass().getInterfaces(), this);
@Override【3】
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
Object methodObject = null;
System.out.println("line up");
methodObject = method.invoke(proxyTarget, args);
System.out.println("go home and sleep");
return methodObject;
当 我们需要动态代理执行的仅是部分方法,那么只需要进行方法名称判断即可。
public class HuangNiuHandle implements InvocationHandler private Object proxyTarget; public Object getProxyInstance(Object target) this.proxyTarget = target; return Proxy.newProxyInstance(proxyTarget.getClass().getClassLoader(), proxyTarget.getClass().getInterfaces(), this); @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable Object methodObject = null; if ("lookConcert".equals(method.getName()) || "seeADoctor".equals(method.getName())) System.out.println("line up"); // 调用目标方法 methodObject = method.invoke(proxyTarget, args); else // 不使用第一个proxy参数作为参数,否则会造成死循环 methodObject = method.invoke(proxyTarget, args); return methodObject;
参考微信公众号:一个优秀的废人一篇文章写的,不能说懂了,但是获得了点东西,感谢!
以上是关于静态代理和动态代理的主要内容,如果未能解决你的问题,请参考以下文章