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采用插件模型,将轨迹收集、管理与...
ANSYS中空隙材料、多孔介质与随机骨料模型的CAD建模插件及应用研究,ansys空隙材料、孔隙材料、多孔介质模型,随机骨料。 CAD建模插件,可导入ansys workbench ,ansys空隙材料; 孔隙材料; 多孔介质模型; 随机骨料; CAD建模插件; 导入ansys workbench,"ANSYS空隙材料多孔介质模型及随机骨料CAD建模插件"
1、文件内容:perl-Image-Info-1.33-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-Image-Info-1.33-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
mysql55-mysql-bench-5.5.37-5.el6.centos.alt.x86_64.rpm
1、文件内容:perl-Module-Implementation-0.06-6.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-Module-Implementation-0.06-6.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
Video_587150722718831.mp4
1、文件内容:pcs-snmp-0.9.169-3.el7.centos.3.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/pcs-snmp-0.9.169-3.el7.centos.3.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
"GL8碰撞仿真CAE有限元模型文件:141份文档,总大小281M",GL8碰撞cae有限元模型 141 wenjian大小281m ,GL8碰撞; cae有限元模型; 大小281m; 141 wenjian,GL8碰撞CAE有限元模型:大型高精度281M文件
MATLAB高级仿真:储能系统在调峰调频中的联合优化模型——深度探索充放电策略与运行协同优势,MATLAB代码:储能参与调峰调频联合优化模型 关键词:储能 调频 调峰 充放电优化 联合运行 参考文档:《Using Battery Storage for Peak Shaving and Frequency Regulation: Joint Optimization for Superlinear Gains》完全复现 仿真平台:MATLAB+CVX 平台 优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品 主要内容:代码主要做的是考虑储能同时参与调峰以及调频的联合调度模型,现有代码往往仅关注储能在调峰方面的能力,而实际上同时参与调峰调频将超线性的提高储能的收益,在建模方面,构建了考虑电池 化成本、充放电功率约束以及用户负荷不确定性的储能优化模型,整体复现结果和文档一致,该代码具有一定的创新性,适合新手学习以及在此基础上进行拓展,代码质量非常高,保姆级的注释以及人性化的模块子程序 ,关键词:储能; 调峰调频; 联合优化模型; 充放电优化; 电池退化成本; 用户负荷
1、文件内容:perl-IO-Compress-2.061-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-IO-Compress-2.061-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1、文件内容:perl-IO-Socket-INET6-2.69-5.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-IO-Socket-INET6-2.69-5.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
电脑调音软件下载是专为汽车音响爱好者和专业人士设计的一款强大工具, 这款软件的主要功能在于帮助用户对车载音频系统进行精确的数字信号处理,以提升音乐播放效果,提供更丰富的听觉体验。
1、文件内容:perl-File-Fetch-0.42-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/perl-File-Fetch-0.42-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
智慧园区管理系统-活动资源
基于电动汽车灵活性的微网多尺度协调调度模型研究与应用,计及电动汽车灵活性的微网多时间尺度协调调度模型 摘要:构建了含有电动汽车参与的微网 电厂多时间尺度协调优化模型,其中包括日前-日内-实时三阶段,日前阶段由于风光出力具有不确定性,结合风光预测值作初步经济调度;日内阶段,风光出力观测的更加准确,通过调节储能、需求响应等单元对调度方案作进一步调整,避免遭受高额的不平衡惩罚;实时阶段,风光出力的预测结果更准确,为了进一步降低微网与上级电网并网功率的波动性,充分利用电动汽车的灵活性,调度电动汽车的充放电以减少功率波动,兼顾调度的安全性与经济性。 本代码为代码,实现效果见下图 ,电动汽车灵活性; 微网多时间尺度; 协调调度模型; 风光出力; 储能调节; 需求响应; 功率波动性,《微网中电动汽车灵活性的多时间尺度协调调度模型》
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
转正汇报(3).pdf
星落最强稳定版pak(1).zip