`
suichangkele
  • 浏览: 200392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何选择性得加载某些包下面的类

    博客分类:
  • java
阅读更多

上一篇博客刚刚写了类加载器的东西,这里马上就用到了,使用类加载器来加载某个包下面的类,比如我们的代码时com.xxx.yyy,那么我想在容器启动的时候加载包下面的某些类来做些一些启动前的检查,就需要我们使用类加载器来加载类了。

我想到这个的原因有两个:一个是spring的路径扫描,即spring会扫面某个路径下面的bean,然后放入spring的ioc容器,这个一直以来都困惑着我,她是如何做到的呢?第二个是log4j2中的插件,比如我们在log4j中配置的很多appender:File,Console,RollingFile,Root,Info等,他的官方的解释是这些都对应着插件,那么log4j是如何找到这些插件的呢,直到我最近看了log4j2的源码才明白了他的实现原理。我这篇博客使用的就是log4j2加载某个路径下面的方法。

 

log4j2中有个ResolverUtil,里面有个find(final Test test, final String... packageNames)方法,就是从指定的包下面来加载类,然后根据传入的Test来决定加载的这些类符不符合要求,如果符合就会将其class对象放到一个集合中,然后调用getClasses方法就可以获得在指定的包下想要的类。从他的源码中可以发现,如论当前的类是在File中还是jar包中都可以加载。这里的Test接口很简单,就是决定但钱加载的类符不符合要求,他有个方法决定是加载类还是资源,即

 boolean doesMatchClass();方法和boolean doesMatchResource();方法,前者表示只加载class,后者表示都加载所有的资源,当然我们都是选择加载类,那么第一个方法返回true,第二个返回false。还有一个方法是决定要加载的类是否要符合条件,即

 boolean matches(Class<?> type);方法,在log4j2中使用的是根据type.getAnnotation(plugin.class) != null,即加载的类必须有@Plugin这个注解。

 

他的具体实现还是实用classloader,因为classloader我也没有看,所以尽管我看完了ResolverUtil的源码,但是他的具体的细节我在这里也无法描述。不过我们已经有了一个不错的方法来选择性的加载多个包下面的类了。大笑

 

 

 

 

分享到:
评论

相关推荐

    注册表删除IE加载项

    如果确定要完全删除加载项,可以右击加载项的GUID子键并选择删除。 #### 步骤5:重启浏览器 完成以上步骤后,重新启动IE浏览器,以使更改生效。 ### 注意事项 - 修改注册表是一项高风险操作,错误地修改或删除...

    两套预加载表针代码

    下面我们将详细探讨预加载的概念、重要性以及这两套代码可能涉及的技术点。 首先,理解预加载的基本概念。预加载是通过HTML5的标签或者JavaScript来实现的,它告诉浏览器某些资源对于页面的后续操作至关重要,应...

    PHP文件自动加载

    ### PHP文件自动加载详解 #### 一、引言 在PHP开发中,随着项目规模的不断扩大,类的数量也会随之增加,这导致了...在实际应用中,开发者可以根据项目的特点选择合适的自动加载方案,以提高代码的可读性和可维护性。

    图片加载JS效果

    在压缩包中的"图片加载显示JS效果"可能包含了以上某些技术的示例代码或者说明文档。通过阅读这些文件,你可以深入理解并实践图片加载的各种JavaScript技术,从而优化你的网页性能和用户体验。 总之,JavaScript在...

    省、市、地区联动选择JS封装类

    8. **可配置性**:为了适应不同的项目需求,组件可能允许开发者自定义某些属性,如数据源、样式、初始值等。 9. **性能优化**:为了提升用户体验,可能会有缓存策略、防止重复请求、快速查找算法等性能优化措施。 ...

    如何加载图像以及保存图像到数据库中以及如何读取显示出来

    在IT领域,尤其是在开发图形用户界面(GUI)应用程序时,加载和处理图像是一项常见的任务。QT框架是一个功能强大的跨平台工具包,它提供了丰富...在QT中,图像处理的灵活性和便捷性使得它成为开发图形应用的理想选择。

    Python实现动态加载模块、类、函数的方法分析

    ### Python 实现动态加载模块、类、函数的方法分析 在Python编程中,动态加载模块、类和函数是一种非常实用的功能,特别是在需要根据运行时环境或用户输入来改变程序行为的情况下。下面将详细介绍几种常见的实现...

    在dos下加载USB驱动

    此外,某些老式硬件可能不完全支持USB,所以也可能遇到兼容性问题。 在实际操作过程中,可能还需要处理其他问题,如BIOS设置、DOS版本的限制等。确保你的BIOS设置允许从USB设备启动,并且DOS版本足够新以支持USB...

    HIVE相关的jar包

    因此,选择与你的Hadoop集群和Hive版本兼容的jar包是非常重要的,以确保程序的稳定性和兼容性。 在实际开发中,如果你的项目依赖于特定版本的Hive,你需要将对应的Hive jar包添加到你的类路径中。这通常在构建工具...

    WinCE动态加载驱动EVC源码

    在Windows CE操作系统中,动态加载驱动程序是一种节省系统资源、提高系统灵活性的技术。与静态加载驱动(在系统启动时加载)不同,动态加载允许在运行时根据需要加载和卸载驱动,这对于某些特定应用场景非常有用,...

    云鸽盒子刷机工具包-斐讯N1.rar

    这份压缩包包括了三个核心部分:U盘写入工具、斐讯N1镜像和斐讯N1刷机包,下面将对这三个关键元素进行详细的解读。 首先,U盘写入工具是刷机过程中必不可少的软件工具。它主要用于将镜像文件写入到USB闪存驱动器中...

    css3实现的鼠标经过按钮边框加载特效源码.zip

    4. **CSS3选择器**:除了伪类选择器,CSS3还引入了更多的选择器,如属性选择器(`[attribute=value]`)、类选择器(`.class`)和ID选择器(`#id`),这些可以帮助我们更精确地定位和控制元素。 5. **盒模型**:理解...

    微信emoji表情图片包,包含一个文本对应表情的文件

    某些表情在不同文化中可能有不同的含义,因此在设计和选择表情时需谨慎。 8. **性能优化**: 大量的表情图片可能会增加应用的加载时间,所以需要通过压缩技术、懒加载策略等手段来优化性能,确保用户体验流畅。 9. ...

    Thymeleaf所需要的jar包

    不过在某些开发环境中,可能需要关闭缓存以实现热加载。 5. **JDK兼容性库**: - `thymeleaf-jdk15to18.jar`(或不同JDK版本的对应库):这些库确保Thymeleaf在不同版本的JDK上运行时的兼容性。 6. **第三方方言...

    Java虚拟机类装载.doc

    Java虚拟机的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块,而不影响系统其他功能模块的正常运行。 Java虚拟机类装载的过程可以分为三个步骤:装载、链接和初始化。在装载过程中,JVM会查找...

    java皮肤包

    下面将详细介绍Java皮肤包的相关知识点。 1. **Java LookAndFeel API** Java LookAndFeel API 是Java Swing的一部分,它提供了改变应用程序界面外观的能力。通过更换LookAndFeel,可以使得应用看起来像是Windows、...

    两中包含的区别.txt

    - **动态包含**提供了更高的灵活性,可以用来动态加载页面的不同部分。这种方式特别适合于需要根据用户操作或条件动态改变页面内容的情况。 ### 示例对比 为了更直观地理解这两种包含方式的区别,下面通过示例来...

    vc 动态菜单加载.rar

    下面将详细介绍如何在VC++中实现动态菜单加载。 首先,我们需要理解MFC(Microsoft Foundation Classes)框架,它是VC++用于Windows应用程序开发的一个库。MFC提供了对Windows API的封装,简化了菜单、对话框、控件...

    将MFC资源文件打包成dll

    在某些情况下,为了实现代码重用或模块化,开发者可能需要将资源文件(如对话框、图标、菜单等)打包到一个动态链接库(DLL)中。这篇博文详细介绍了如何将MFC资源文件转换为DLL,便于其他程序调用。下面,我们将...

    eclipse汉化包

    下面将详细介绍如何使用Eclipse汉化包以及涉及的相关知识点。 1. **汉化包安装过程**: - 首先,你需要下载对应版本的Eclipse汉化包。这个压缩包通常包含了与Eclipse相应版本兼容的语言包。 - 解压缩下载的文件,...

Global site tag (gtag.js) - Google Analytics