本发明涉及IT技术领域,特别是指一种基于ClassLoader的自定义类查找方法。
背景技术:
随着信息系统的复杂性日益增大,使用反射机制设计的系统越来越多。根据不同的业务需要通过反射去获得相应的处理类的前提是如何获得类的信息。传统的方法有两种:第一种是使用配置文件的方式记录。这种方式在业务复杂性较大或者类比较多的时候,配置文件就显得不够灵活,不易于扩展、可维护性差。第二种是采用Jdk基础的反射类,通过扫描文件或jar包中的文件获取业务系统的处理类。这种方式实现比较简单也易于扩展,但缺点是只能扫描到处理程序外部的class文件或jar文件。对于嵌套的jar文件,由于不能在操作系统中识别为文件,导致此方法扫描的范围有局限性,对于普通的以jar方式运行的程序就无法使用。
技术实现要素:
本发明解决的技术问题在于提供一种基于ClassLoader的自定义类查找方法,在整个类加载的范围内查找业务需要的类,提供了一种搜索范围广、灵活的、易于扩展的解决方案。
本发明解决上述技术问题的技术方案是:
所述的方法包括如下步骤:
步骤1:取得运行环境的ClassLoader;
步骤2:根据类路径查找类的URL;
步骤3:读取类的相关信息;
步骤4:根据类的自定义注解信息对类进行归类保存。
所述的运行环境的ClassLoader,通常是程序运行当前线程的类加载器,若当前线程没有定义则使用系统的类加载器。
所述的类路径是指识别一个类的基础路径,包括com/gcloud/cloud/adapter/xxx.class;
所述的类的URL是定位这个类在操作系统的文件路径或jar包中的路径,是资源的定位路径。
所述的类的相关信息主要是类的基础信息,包括类的名字,类的属性方法等信息。
所述的自定义注解是指用户根据系统业务需要定义的注解,能标记每个类在程序中的业务属性;
所述的对类进行归类保存,主要是根据业务属性的不同把相关信息保存在内存中,此内存信息作为全局的信息,能被系统所有逻辑引用。
本发明查找类的范围广,能查找普通文件的类、Jar包中的类和Jar包里面嵌套的Jar包中的类;本发明适用于Java语言开发的普通Java程序和Web程序,搜索类的范围广,能满足复杂的业务要求。其他面向对象语言若使用类似的ClassLoader管理类的也可参考此方法进行改造使用。
附图说明
下面结合附图对本发明进一步说明:
图1为本发明的流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图并以实际开发案例作进一步详细说明。如图1所示,具体实施过程如下:
本样例根据本发明的原理,结合spring开源框架的部分工具类对类进行加载解析,最后把查找到的类保存在程序运行的内存中。
1、取得运行环境的ClassLoader。
下面三种方式可以取得ClassLoader,优先使用第一种获取本运行环境的ClassLoader
ClassLoader cl=Thread.currentThread().getContextClassLoader();
ClassLoader cl=XXXX.class.getClassLoader();
ClassLoader cl=ClassLoader.getSystemClassLoader();
2、根据类路径查找类的URL。
定义需要查找的类路径,支持*通配符
String packageSearchPath =
″classpath*:com/gcloud/cloud/adapter/**/*.class″;
根据指定的路径查找对应路径的所有类
PathMatchingResourcePatternResolver resolver=new
PathMatchingResourcePatternResolver();
Resource[]resources=resolver.getResources(packageSearchPath);
查找出来类的URL格式如下:
URL
[jar:file:/D:/new_svn/gcloud-multicloud/gcloud-cloud-adapter/gcloud-cloud-adapter-api/target/gcloud-cloud-adapter-api-0.0.1-SNAPSHOT.jar!/BO OT-INF/classes!/com/gcloud/cloud/adapter/Adapter.class]
URL
[jar:file:/D:/new_svn/gcloud-multicloud/gcloud-cloud-adapter/gcloud-cloud-adapter-api/target/gcloud-cloud-adapter-api-0.0.1-SNAPSHOT.jar!/BO OT-INF/classes!/com/gcloud/cloud/adapter/config/WebMvcConfig.class]
3、读取类的相关信息。
根据第二步的URL可以定位到class文件在jar包中的位置,再把文件转成input stream方式进行读取
4、根据类的自定义注解信息对类进行归类保存。
截止到第三步,所需要的类的Class对象candidate已经生成,可以在内存中保存该类的对象,后续的业务逻辑可以通过该对象获得更多的信息。
如通常我们可以使用自定义注解的方式定义业务上需要的信息,如下面的CommandAction注解代表在hwcloud执行挂载网卡AttachNetworkInterface操作。
@CommandAction(action=″AttachNetworkInterface″,platformType=″hwcloud″)public class AttachNetworkInterfaceCommand extends HwcloudBaseCommand{}
使用反射出来的candidate对象获取注解等信息
内存中记录hwcloud中AttachNetworkInterface操作使用该