1. ClassWorking Utilities In Spring Framework
1.1. org.springframework.core.GenericCollectionTypeResolver
Helper class for determining element types of collections and maps. Mainly intended for usage within the framework, determining the target type of values to be added to a collection or map (to be able to attempt type conversion if appropriate). Only usable on Java 5. Use an appropriate JdkVersion check before calling this class, if a fallback for JDK 1.4 is desirable.
从javadoc中的说明就可以猜到,像getCollectionType(), getMapKeyType()和getMapValueType()之类的常用方法, 在这个类里是不会缺的。
org.springframework.core.GenericTypeResolver跟GenericCollectionTypeResolver类似, 只不过, 现在不是针对Collection类型, 而是针对一般的Generic类。
1.2. org.springframework.core.annotation.AnnotationUtils
AnnotationUtils填补了默认的反射API中有关Annotation相关的几个功能,比如, 使用默认的反射API你只能读取当前class上的Annotation,而通过AnnotationUtils, 我们则可以获取当前class继承层次上的所有标注的Annotation, 更多信息可以参考该类的Javadoc.
|
Tip
有关Annotation的继承, 这里可以总结几句:
-
如果Annotation是标注于Interface之上的话, 不管该Annotation类型是否标注了@Inherited这个Annotation, 被标注的Interface的实现类都不会“继承” 这一Annotation。 也就是说,标注于Interface上的Annotation,通过反射API只能在这个Interface上才能读取到这一Annotation。
-
如果Annotation是标注于Class之上的话, 分两种情况:
-
如果当前的Annotation类型被标注了@Inherited,那么, 标注了当前Annotation的Class的子类会获得当前Annotation的“继承”, 也就是说, 即使子类没有标注这个Annotation,通过subClass.getClass().getAnnoation(currentAnnotation)也会获得这个Annotation所持有的元数据信息。
-
如果这个Annotation没有被标注@Inherited,那么, 子类不会获得这种继承。
结合以上信息, 也就不难想到为什么Spring会倡导将Transactional之类的Annotation标注在具体的实现类上,而不是Interface之上了。
|
1.3. org.springframework.util.ClassUtils
在 org.apache.commons.lang.ClassUtils存在的前提下,有重新发明轮子之嫌, 不过, 还是有一些补足的, 用与不用完全看你个人口味啦。不过,千万别跟我提“绑定到XX框架”这样的论调, 除非你真的能够像古代那样做个自给自足的隐士!
1.4. org.springframework.util.MethodInvoker
Helper class that allows for specifying a method to invoke in a declarative fashion, be it static or non-static. Usage: Specify "targetClass"/"targetMethod" or "targetObject"/"targetMethod", optionally specify arguments, prepare the invoker. Afterwards, you may invoke the method any number of times, obtaining the invocation result. Typically not used directly but via its subclasses MethodInvokingFactoryBean and MethodInvokingJobDetailFactoryBean.
主要适用于对某个确定的方法调用多次的场景, 如果每次都是调用不同的对象上的不同的方法的话, 需要提供多个该类的实例。 如果是在Spring容器内使用的话, 大多数时候会是使用MethodInvokingFactoryBean或者MethodInvokingJobDetailFactoryBean这样的子类。
1.5. org.springframework.util.ReflectionUtils
这个类主要对Java ReflectionAPI进行了封装, 虽然它的javadoc中声明仅限于框架内部使用,不过如果你不介意的话, 也可以拿来一用吧!不过,后果自负,哈
通过Java标准Reflection API是取不到方法参数的名称的,要达到这个目的,除了可以通过读取class文件中的debug信息(可能在compile的时候没有启用), 也可以使用类似ASM这样的类库获得, 不过, Spring framework中已经对读取方法参数名称这一功能进行了抽象和实现,我们可以直接拿过来用, 这一抽象接口为org.springframework.core.ParameterNameDiscoverer。
ParameterNameDiscoverer主要有三个实现类:
-
LocalVariableTableParameterNameDiscoverer
-
PrioritizedParameterNameDiscoverer
-
AspectJAdviceParameterNameDiscoverer
其中, LocalVariableTableParameterNameDiscoverer为最常用的实现类, 它会使用ObjectWeb的ASM来读取方法参数名称。
|
Warning
LocalVariableTableParameterNameDiscoverer只能发现具体实现类的Class上的方法参数名称,对于接口类型的Class上的方法参数名称, 需要另寻他路,比如扫描接口的实现类并匹配相应方法,然后读取实现类相应方法的参数名称 ,或者直接通过Annotation标注相应的方法参数, 然后通过反射API读取等等。
|
PrioritizedParameterNameDiscoverer纯粹是借助于它所持有的多个ParameterNameDiscoverer来完成方法参数名称的获取工作,它会按照顺序请求它所持有的ParameterNameDiscoverer来完成每一个ParameterNameDiscoverer本应完成的任务。
AspectJAdviceParameterNameDiscoverer主要用于集成了AspectJ的SpringAOP Advice实现类, 通过它的Javadoc可以获得进一步的详细信息。
以下是LocalVariableTableParameterNameDiscoverer和ParaNamer的简单使用代码示例:
Class<SubscriptionServiceImpl> clazz = SubscriptionServiceImpl.class;
Method method = ReflectionUtils.findMethod(clazz, "listAllSubscription",new Class<?>[]{String.class, Integer.class,Date.class,Date.class} );
ParameterNameDiscoverer pmDiscoverer = new LocalVariableTableParameterNameDiscoverer();
String[] parameterNames = pmDiscoverer.getParameterNames(method);
// BytecodeReadingParanamer reader = new BytecodeReadingParanamer();
// String[] parameterNames = reader.lookupParameterNames(method);
for(String parameterName : parameterNames)
{
System.out.println(parameterName);
}
3. classpath auto scanning 功能
我们知道,Spring2.5之后引入了类路径的自动扫描功能,Spring框架为这一功能提供了很好的扩展点,我们可以通过BeanNameGenerator或者自定义的org.springframework.core.type.filter.TypeFilter来定制自动扫描的行为, 比如:
<context:component-scan base-package="..." name-generator="..">
<context:exclude-filter type="annotation" expression="..."/>
<context:include-filter type="annotation" expression="..."/>
</context:component-scan>
除此之外,我们实际上还可以较为独立的形式来使用Spring框架提供的这一类路径自动扫描功能,或者说, class的元数据信息读取功能。 这一功能的核心类为MetadataReader, 以下代码给出了使用这一核心类的简单示例代码:
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver);
// or new SimpleMetadataReaderFactory()
MetadataReader reader = metadataReaderFactory.getMetadataReader("cn/spring21/code/samples/spring/controller/SimpleController");
AnnotationMetadata annotationMD = reader.getAnnotationMetadata();
ClassMetadata clazzMD = reader.getClassMetadata();
System.out.println(annotationMD.hasAnnotation("org.springframework.stereotype.Component"));
System.out.println(clazzMD.getClassName());
ResourcePatternResolver主要用于加载相应的Resources, 这里就是class文件, MetadataReaderFactory用于构造相应的MetadataReader,它有两个实现类,即SimpleMetadataReaderFactory和CachingMetadataReaderFactory。通过相应MetadataReaderFactory实现类获得可用的MetadataReader之后,就可以根据MetadataReader的getAnnotationMetadata()和getClassMetadata()返回的值对象来提取自己需要的信息了。
分享到:
相关推荐
Jwebap通过ClassWorking实现轨迹注入,无需修改原有代码,避免了对JVM或OS的依赖。已经实现的ClassEnhancer和PackageEnhancer可对指定类和包进行注入。 ### 9. 插件架构 Jwebap采用插件模型,将轨迹收集、管理与...
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
基于java的学生网上请假系统的开题报告.docx
社会经济繁荣发展的今天,电子商务得到了飞速发展,网上交易越来越彰显出其独特的优越性,在人们的日常生活中,出现了各种类型的交易网站。其中一个就是车辆易主交易网站,它是一个服务于用户买卖二手车辆的交易网站,为用户提供了平等互利、方便快捷的网上交易平台,通过这一类型的网站,用户可自由出售和购买车辆。 本课题主要根据车辆本身的特性,充分发挥互联网的特点与优势,构建一个以二手车辆为商品、基于互联网平台的车辆易主业务交易管理系统,并根据车辆易主业务交易管理系统的应用需求,进行需求分析,进而对网站系统作规划设计。采用IDEA为运行平台,以SSH为框架,运用HTML语言、JSP技术、MySql数据库、JSP与后台数据库链接等关键技术建设二手车网上交易系统,构建车辆易主交易系统的会员注册与登录,网站首页展示、用户发布商品车辆,用户求购商品车辆,分页浏览、购物系统、用户后台管理、管理员用户后台管理等功能,并使这些功能得以实现并更好为用户服务。网站整体构建完成且测试成功后,用户可以进入网站进行注册、登录,登录后,用户可以在网站上发布自己的闲置车辆或者寻找想要购买的车辆,还可以收藏车辆,管理发布和收藏的车辆,