根据我自己的的理解:
静态代理是实现抽象接口,在代理汇中获取代理对象的对象。需要一一去重写抽象类中的方法。
动态代理使用的是反射,需要我们传入被代理类,并默认实现所有的目标方法,通过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; } }
参考微信公众号:一个优秀的废人一篇文章写的,不能说懂了,但是获得了点东西,感谢!