当前位置: 首页 > news >正文

深圳营销网站建设公司哪家好百度推广培训

深圳营销网站建设公司哪家好,百度推广培训,企业信息查询官网系统,河南软件开发公司有哪些前言 在之前的文章中我们将#xff0c;静态方法、构造方法、实例方法的增强逻辑都分析完毕#xff0c;但在增强前#xff0c;对于拦截类的加载是至关重要的#xff0c;下面我们就来详细的分析 增强插件的加载 静态方法增强前的加载 //clazz 要修改的字节码的原生类 Sta…前言 在之前的文章中我们将静态方法、构造方法、实例方法的增强逻辑都分析完毕但在增强前对于拦截类的加载是至关重要的下面我们就来详细的分析 增强插件的加载 静态方法增强前的加载 //clazz 要修改的字节码的原生类 StaticMethodsAroundInterceptor interceptor InterceptorInstanceLoader.load(staticMethodsAroundInterceptorClassName, clazz.getClassLoader());构造/实例方法前的加载 //当前拦截到的类的类加载器 interceptor InterceptorInstanceLoader.load(instanceMethodsAroundInterceptorClassName, classLoader);问题 可以看到静态方法增强可以直接通过clazz.getClassLoader()获取类加载器而实例方法增强需要从上层方法传递ClassLoader这是为什么 静态方法增强直接通过clazz.getClassLoader()获取类加载器是因为静态方法直接绑定了类构造/实例方法增强需要从上层传递ClassLoader有两个原因 一份字节码可能被多个ClassLoader加载这样加载出来的每个实例都不相等所以必须要绑定好ClassLoader加载插件拦截器可能会出现无法加载的情况如果把加载过程放到了intercept中会和加载失败的异常和业务异常会混淆在一起如果放到ConstructorInter的构造方法中进行加载就会把异常分割开 这个问题解决了下面来详细加载的过程 InterceptorInstanceLoader public class InterceptorInstanceLoader {private static ConcurrentHashMapString, Object INSTANCE_CACHE new ConcurrentHashMapString, Object();private static ReentrantLock INSTANCE_LOAD_LOCK new ReentrantLock();/*** key - 当前插件要拦截的这个目标类的类加载器* value - AgentClassLoader类加载器 作用能加载当前插件也能加载要拦截的这个目标类* */private static MapClassLoader, ClassLoader EXTEND_PLUGIN_CLASSLOADERS new HashMapClassLoader, ClassLoader();/*** Load an instance of interceptor, and keep it singleton. Create {link AgentClassLoader} for each* targetClassLoader, as an extend classloader. It can load interceptor classes from plugins, activations folders.** param className the interceptor class, which is expected to be found* param targetClassLoader the class loader for current application context* param T expected type* return the type reference.*/public static T T load(//要进行增强逻辑的增强类String className,//当前拦截到的类的类加载器ClassLoader targetClassLoader) throws IllegalAccessException, InstantiationException, ClassNotFoundException, AgentPackageNotFoundException {if (targetClassLoader null) {targetClassLoader InterceptorInstanceLoader.class.getClassLoader();}//举例说明这个key值//com.test.MyTest_OF_com.test.classloader.MyTestClassLoader123String instanceKey className _OF_ targetClassLoader.getClass().getName() Integer.toHexString(targetClassLoader.hashCode());// className所代表的拦截器的实例 对于同一个classloader而言相同的类只加载一次 Object inst INSTANCE_CACHE.get(instanceKey);if (inst null) {INSTANCE_LOAD_LOCK.lock();ClassLoader pluginLoader;try {pluginLoader EXTEND_PLUGIN_CLASSLOADERS.get(targetClassLoader);if (pluginLoader null) {/*** !!!重点!!!* 这里用AgentClassLoader并把targetClassLoader传入的原因是* 要进行增强逻辑的增强类是由AgentClassLoader进行加载的而要增强的目标类不知道是哪个类加载器。* 但是增强类的逻辑是要在目标类中进行切入的这就要求增强类和目标类的类加载器必须是同一个才行。* 所以这里利用了类加载器的双亲委派机制来进行加载将目标类的类加载器作为AgentClassLoader的父类加载器* */pluginLoader new AgentClassLoader(targetClassLoader);EXTEND_PLUGIN_CLASSLOADERS.put(targetClassLoader, pluginLoader);}} finally {INSTANCE_LOAD_LOCK.unlock();}// 通过pluginLoader来实例化拦截器对象inst Class.forName(className, true, pluginLoader).newInstance();if (inst ! null) {INSTANCE_CACHE.put(instanceKey, inst);}}return (T) inst;} }总结 对于每个插件的增强类都初始化了AgentClassLoader来加载增强类将当前拦截到的类的类加载器传入AgentClassLoader作为其父的类加载器 问题1为什么将当前拦截到的类的类加载器传入AgentClassLoader作为其父的类加载器 将targetClassLoader作为agentClassLoader的父类加载器这样通过双亲委派模型模型targetClassLoader可以加载应用系统中的类 以阿里数据源druid举例假设应用系统中数据源DruidDataSourceStatManager的类是由AppClassLoader加载的 PoolingAddDruidDataSourceInterceptor要修改DruidDataSourceStatManager的字节码两个类需要能交互前提就是PoolingAddDruidDataSourceInterceptor能通过某种方式访问到DruidDataSourceStatManager 让AgentClassLoader的父类加载器指向加载druid的AppClassLoader当PoolingAddDruidDataSourceInterceptor去操作DruidDataSourceStatManager类时通过双亲委派机制AgentClassLoader的父类加载器AppClassLoader能加载到DruidDataSourceStatManager 问题2为什么每个插件的增强类都要初始化一个AgentClassLoader来加载增强类不能共用一个吗 如果只实例化一个AgentClassLoader实例由于应用系统中的类不存在于AgentClassLoader的classpath下那此时AgentClassLoader加载不到应用系统中的类。 比如说第一个业务类是由BootStrapClassLoader加载的第二个业务类是由AppClassLoader加载的根据双亲委派机制那么第二个业务类增强就会有问题因为在一个业务类增强时AgentClassLoader的父的类加载器已经是BootStrapClassLoader了是加载不到AppClassLoader的内容的 以上关于非JDK类库的静态方法、构造方法、实例方法都已经分析完毕后面的文章会详细分析JDK类库中的类是如何被增强拦截的
http://www.zqtcl.cn/news/847514/

相关文章:

  • 如何分析一个网站网站页面建设
  • 做网站好网页制作3个网页的网站图片
  • 合肥网站建设网站推广新的网站建设一般多少钱
  • 北京网站改版哪家好网站关键词怎样做优化
  • 网站开发行业分析wordpress 粘贴表格
  • 网站开发的招标参数网络科技公司网站源码下载
  • 属于网络营销站点推广的是seo好wordpress主题
  • j2ee只做网站阿里企业邮箱免费
  • 做企业网站需要买什么资料室内设计学徒
  • 网站新增关键词设计公司logo公司文化
  • 怎么写一个网站程序农产品网站如何做地推
  • 北京网站优化服务商有了域名怎么建网站
  • 转运网站开发国外永久免费crm系统
  • 免费网站建设网站wordpress扁平化中文主题
  • 外贸企业网站策划个人简历模板免费可编辑
  • 自助建站免费建站免费建站工具有哪些
  • 海外网站导航前端静态网站开发
  • 德庆网站建设价格网站的月度流量统计报告怎么做
  • 网站哪里买外链品牌网站设计步骤
  • 网站推广 优帮云淄博网站制作公司
  • 二手书哪个网站做的好wordpress 直排主题
  • 网站开发风险分析做情诗网站
  • 怎样可以快速增加网站的反链网络广告平台有哪些
  • 学校网站源码小游戏网站审核怎么做
  • 西乡网站建设政务网站开发协议
  • 美食网站开发环境北京app网站建设
  • 郑州网站建设推广渠道重庆网站建设公司下载
  • 宜宾营销型网站建设网站建设需要什么资质
  • 重庆建网站有哪些学跨境电商要多少钱
  • 上海建设钢结构工程网站深圳电器公司排名