新能源网站建设哪家好,优化网址,做网站需要怎么分工,seo技术顾问阿亮我的JDK动态代理流程 
我梳理的动态代理流程大约是#xff1a; 如果每一个框架都有自己的BPP#xff0c;且自己的BPP中都有自己的wrapIfNecessory#xff0c;那样可能就是一个BPP一个代理类。但通常应该都是各自的框架以提供 Advisior#xff08;切面#xff09;的方式 如果每一个框架都有自己的BPP且自己的BPP中都有自己的wrapIfNecessory那样可能就是一个BPP一个代理类。但通常应该都是各自的框架以提供 Advisior切面的方式让AOP的BPP去处理他们的Advisior。  BeanPostProcessor 处理bean的时候会找到这个bean匹配上的的advisior切面的集合。  ProxyFactory 拿到adivisor的集合和目标类之后 设置当前代理的 advicisor、设置当前代理的目标对象 targetClass设置当前代理的接口类使用Jdk或者cglib动态代理创建代理类createAopProxy().getProxy();  生成代理类  JDK动态代理  JDK动态代理要求被代理类必须实现方法否则报错。原因当然和JDK动态代理的原理有关系了。 public Object getProxy(Nullable ClassLoader classLoader) {return Proxy.newProxyInstance(classLoader, this.proxiedInterfaces, this);
}生成代理类 public Class? apply(ClassLoader loader, Class?[] interfaces) {。。。byte[] proxyClassFile  ProxyGenerator.generateProxyClass(proxyName, interfaces, accessFlags);。。。
}生成代理类  将所有方法包装成ProxyMethod对象 将Object类中的hashCode、equals、toString方法包装成ProxyMethod对象获取代理类接口列表遍历每个接口的每个方法并包装成ProxyMethod对象  为代理类组装各种字段信息和方法信息 添加构造器方法该构造器参数为InvocationHandler类型添加静态字段及代理方法添加静态字段的初始化方法  写入class文件 验证常量池中存在代理类的全限定名验证常量池中存在代理类父类的全限定名即Proxy类验证常量池中存在代理类接口的全限定名写入class文件前将常量池设为只读当前常量池中的变量不允许修改每个class文件的前四个字节为魔数用来确定这个文件是否是一个能被虚拟机接受的class文件后面再跟两个字节的次版本号和两个字节的主版本号。。。转成二进制文件输出     在调用代理对象方法时会在方法内执行super.h.invoke(this, m3, new Object[]{var1});。即调用JdkDynamicAopProxy的invoke方法。 final class JdkDynamicAopProxy implements AopProxy, InvocationHandler, Serializable {// 这里传的是thispublic Object getProxy(Nullable ClassLoader classLoader) {if (logger.isTraceEnabled()) {logger.trace(Creating JDK dynamic proxy:   this.advised.getTargetSource());}return Proxy.newProxyInstance(classLoader, this.proxiedInterfaces, this);}
}public class Proxy implements java.io.Serializable {// super.h  new JdkDynamicAopProxy();protected InvocationHandler h;public static Object newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h)}public final String getUserByName(String var1) throws  {/***   调用父类的h属性的invoke方法*/return (String)super.h.invoke(this, m3, new Object[]{var1});}
}JdkDynamicAopProxy的invoke方法  获取MethodInterceptor集合 chainListObject chain  this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);  对于拦截器链为空的情况会直接执行目标方法  对于拦截器链不为空的情况会将代理对象、目标方法、拦截器链等信息封装为一个 ReflectiveMethodInvocation 对象然后通过它的proceed方法完成拦截器中的增强逻辑和目标方法的执行。 MethodInvocation invocation  new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);调用方法retVal  invocation.proceed();