目录
2.AnnotationUtils&AnnotatedElements:
ReflectionUtils:
Field findField(Class<?> clazz, String name) //根据类类型,字段名称查询一个字段
Field findField(Class<?> clazz, String name, Class<?> type) //根据类类型,字段名称和字段类型查询一个字段
void setField(Field field, Object target, Object value) //在指定对象(target)中给指定字段(field)设置指定值(value)
Object getField(Field field, Object target) //在指定对象(target)上得到指定字段(field)的值;
Method findMethod(Class<?> clazz, String name) //在类型clazz上,查询name方法
Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes) //在类类型clazz上,查询name方法,参数类型列表为paramTypes
Object invokeMethod(Method method, Object target) //在指定对象(target)上,执行方法(method)
Object invokeMethod(Method method, Object target, Object... args) //在指定对象(target)上,使用指定参数(args),执行方法(method)
Object invokeJdbcMethod(Method method, Object target)
Object invokeJdbcMethod(Method method, Object target, Object... args)
void handleReflectionException(Exception ex) //统一处理反射中的异常
void handleInvocationTargetException(InvocationTargetException ex) //反射异常处理(由Method.invoke(obj, args…)方法抛出)
void rethrowRuntimeException(Throwable ex) //处理运行时异常或error
void rethrowException(Throwable ex) //处理异常或error
boolean declaresException(Method method, Class<?> exceptionType) //判断一个方法上是否声明了指定类型的异常
boolean isPublicStaticFinal(Field field) //判断字段是否是public static final的
boolean isEqualsMethod(Method method) //判断方法是否是equals方法
boolean isHashCodeMethod(Method method) //判断方法是否是hashcode方法
boolean isToStringMethod(Method method) //判断方法是否是toString方法
boolean isObjectMethod(Method method) //判断方法是否是Object类上的方法
boolean isCglibRenamedMethod(Method renamedMethod)
void makeAccessible(Field field) //将一个字段设置为可读写,主要针对private字段
void makeAccessible(Method method) //将一个方法设置为可调用,主要针对private方法
void makeAccessible(Constructor<?> ctor) //将一个构造器设置为可调用,主要针对private构造器
void doWithMethods(Class<?> clazz, MethodCallback mc) //针对指定类型上的所有方法,依次调用MethodCallback回调
//(其实实现很简单,就是得到类上的所有方法,然后执行回调接口;这个方法在Spring针对bean的方法上的标签处理时大量使用,
//比如@Init,@Resource,@Autowire等标签的预处理;)
void doWithMethods(Class<?> clazz, MethodCallback mc, MethodFilter mf) //该版本提供了一个方法匹配(过滤器)MethodFilter
//(首先得到类上所有方法,针对每一个方法,调用MethodFilter实现匹配检查,如果匹配上,
//调用MethodCallback回调方法。该方法会递归向上查询所有父类和实现的接口上的所有方法并处理;)
Method[] getUniqueDeclaredMethods(Class<?> leafClass)
void doWithFields(Class<?> clazz, FieldCallback fc) //针对所有的字段,执行的对应的回调
//(得到类上所有的字段,并执行回调,该方法在Spring中主要用于预处理字段上的@Autowire或者@Resource标签;)
void doWithFields(Class<?> clazz, FieldCallback fc, FieldFilter ff) //针对所有的字段,执行的对应的回调,(针对字段,也提供了一个拥有字段匹配(过滤)的功能方法)
void shallowCopyFieldState(final Object src, final Object dest)
AnnotationUtils&AnnotatedElements:
AnnotationUtils:
AnnotationUtils 解决注解别名,包括显式别名、隐式别名、传递的隐式别名,还可以查的指定注解的属性信息。
AnnotationUtils 底层使用动态代理的方式处理注解别名的问题。
AnnotatedElements:
用于在AnnotatedElements上查找注解,元注解和可重复注解的常规实用程序方法。AnnotatedElementUtils为Spring的元注解编程模型定义了公共API,
并支持注解属性覆盖。如果您不需要支持注解属性覆盖,请考虑使用AnnotationUtils。请注意,JDK的内省工具本身不提供此类的功能。
AnnotationUtis.getAnnotation()
从提供的AnnotatedElement获取annotationType的单个Annotation,其中注解在AnnotatedElement上存在或元存在。
请注意,此方法仅支持单级元注解。要支持任意级别的元注解,请使用findAnnotation(AnnotatedElement,Class)。
AnnotationUtis.findAnnotation()
在提供的AnnotatedElement上查找annotationType的单个Annotation。如果注解不直接出现在提供的元素上,则将搜索元注解。
AnnotatedElementUtils.isAnnotated()
确定在提供的AnnotatedElement上或指定元素上方的注解层次结构中是否存在指定annotationType的注解。
如果此方法返回true,则getMergedAnnotationAttributes方法将返回非null值。
AnnotatedElementUtils.hasAnnotation()
确定指定的annotationType的注解是否在提供的AnnotatedElement上或在指定元素上方的注解层次结构中可用。
如果此方法返回true,则findMergedAnnotationAttributes方法将返回非null值。
AnnotatedElementUtils.getMergedAnnotation()
在提供的元素上方的注解层次结构中获取指定注解类型的第一个注解,将注解的属性与注解层次结构的较低级别中的注解的匹配属性合并,
并将结果合成回指定注解类型的注解。完全支持@AliasFor语义,包括单个注解和注解层次结构。此方法委托给getMergedAnnotationAttributes(AnnotatedElement,Class)
和AnnotationUtils.synthesizeAnnotation(Map,Class,AnnotatedElement)。
AnnotatedElementUtils.findMergedAnnotation()
在提供的元素上方的注解层次结构中查找指定注解类型的第一个注解,将注解的属性与注解层次结构的较低级别中的注解的匹配属性合并,
并将结果合成回指定注解类型的注解。完全支持@AliasFor语义,包括单个注解和注解层次结构。
AopUtils:
boolean isAopProxy(Object object):判断一个对象,是否是代理对象
SpringProxy接口类型,是Spring中所有的代理对象(不管是jdk动态代理,还是cglib代理)都会实现的接口,这个接口是一个标记接口
boolean isJdkDynamicProxy(Object object):判断是否是JDK代理对象
boolean isCglibProxy(Object object):判定是否是cglib完成的代理
Class<?> getTargetClass(Object candidate):用于获取对象的真实类型
boolean isEqualsMethod(Method method):判定给定的方法是否是equals方法
boolean isHashCodeMethod(Method method):判定给定的方法是否是hashCode方法
boolean isToStringMethod(Method method):判定给定的方法是否是toString方法
boolean isFinalizeMethod(Method method):判定给定的方法是否是finalize方法
//因为在动态代理的时候,都是针对类级别的代理,加入匹配的切入点是 .(..),
//那么是否是该类所有方法都会被代理?但是Object本身的equals,hashCode,toString,finalize方法,
//都是需要剔除在代理方法之外的,这四个方法就是来辅助做判断的
Method getMostSpecificMethod(Method method, Class<?> targetClass):从代理对象上的一个方法,找到真实对象上对应的方法
boolean canApply(Pointcut pc, Class<?> targetClass):判断一个切入点能否匹配一个指定的类型
boolean canApply(Pointcut pc, Class<?> targetClass, boolean hasIntroductions):判断一个切入点能否匹配一个指定的类型,是否支持引入匹配
boolean canApply(Advisor advisor, Class<?> targetClass):判断一个建议(advisor)能否匹配一个指定的类型
boolean canApply(Advisor advisor, Class<?> targetClass, boolean hasIntroductions):判断一个建议(advisor)能否匹配一个指定的类型,是否支持引入匹配
List<Advisor> findAdvisorsThatCanApply(List<Advisor> candidateAdvisors, Class<?> clazz):在一组建议(advisor)中,返回能够匹配指定类型的建议者列表
Object invokeJoinpointUsingReflection(Object target, Method method, Object[] args):执行一个目标方法;这个方法其实就是method.invoke方法的更完善的方法(里面有对method.invoke进行异常捕获处理),
指在target对象上,使用args参数列表执行method
introduction:使用AOP为一个类动态的添加一个父类,或者额外实现一个接口,甚至增加一个字段等等操作。
public interface IAddition {
void addtional();
}
public class AdditionImpl implements IAddition {
@Override
public void addtional() {
System.out.println("out additional...");
}
}
要实现这个需求非常方便,只需要在Advice中添加:
@DeclareParents(value = "cn.wolfcode.springboot.utilstest.IEmployeeService+",
defaultImpl = AdditionImpl.class)
public IAddition addition;
测试代码:
@Test
public void testIntroductions(){
((IAddition)service).addtional();
}
输出:
out additional...
业务接口及其实现:
public interface IEmployeeService {
//业务接口
void someLogic();
}
public class EmployeeServiceImpl implements IEmployeeService {
@Override
public void someLogic() {
System.out.println("do something");
}
}
用于增强的类:
@Aspect
@Component
public class Advice {
@Before("execution(* cn.wolfcode.spring.utilstest.*Service.*(..))")
public void advisor() {
System.out.println("do before");
}
}
//创建主配置类:
@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class AopConfig {
@Bean
public IEmployeeService target() {
return new EmployeeServiceImpl();
}
}
额外准备一个接口和实现:
public interface IAddition {
void addtional();
}
public class AdditionImpl implements IAddition {
@Override
public void addtional() {
System.out.println("out additional...");
}
}
StringUtils:
判断相关:属于该类别的方法都是在对字符串进行一些判定操作
boolean isEmpty(Object str):字符串是否为空或者空字符串:""
boolean hasLength(CharSequence str):字符串是否为空,或者长度为0
boolean hasText(String str):字符串是否有内容(不为空,且不全为空格)
boolean containsWhitespace(String str):字符串是否包含空格
字符串头尾操作:都是对字符串前,或者字符串后的内容进行判定或者操作
String trimWhitespace(String str):去掉字符串前后的空格
String trimAllWhitespace(String str):去掉字符串中所有的空格
String trimLeadingWhitespace(String str):去掉字符串开头的空格
String trimTrailingWhitespace(String str):去掉字符串结束的空格
String trimLeadingCharacter(String str, char leadingCharacter):去掉字符串开头的指定字符
String trimTrailingCharacter(String str, char trailingCharacter):去掉字符串结尾的指定字符
boolean startsWithIgnoreCase(String str, String prefix):判断字符串是否以指定字符串开头,忽略大小写
boolean endsWithIgnoreCase(String str, String suffix): 判断字符串是否以指定字符串结尾,忽略大小写
文件路径名称相关操作:是针对文件名,文件路径,文件后缀等常见文件操作中需要用到的方法进行封装
String unqualify(String qualifiedName):得到以.分割的最后一个值,可以非常方便的获取类似类名或者文件后缀
String unqualify(String qualifiedName, char separator): 得到以给定字符分割的最后一个值,可以非常方便的获取类似文件名
String capitalize(String str):首字母大写
String uncapitalize(String str):取消首字母大写
String getFilename(String path):获取文件名,就不需要再使用FilenameUtils
String getFilenameExtension(String path):获取文件后缀名
String stripFilenameExtension(String path):截取掉文件路径后缀
String applyRelativePath(String path, String relativePath):找到给定的文件,和另一个相对路径的文件,返回第二个文件的全路径
String cleanPath(String path):清理文件路径,这个方法配合applyRelativePath就可以计算一些简单的相对路径了
boolean pathEquals(String path1, String path2):判断两个文件路径是否相同,会先执行cleanPath之后再比较
字符串和子串的操作:主要是提供了字符串和字符串子串的操作,比如子串的匹配,子串的替换;子串的删除等等操作
boolean substringMatch(CharSequence str, int index, CharSequence substring):判断从指定索引开始,是否匹配子字符串
int countOccurrencesOf(String str, String sub):判断子字符串在字符串中出现的次数
String replace(String inString, String oldPattern, String newPattern):在字符串中使用子字符串替换
String delete(String inString, String pattern):删除所有匹配的子字符串
String deleteAny(String inString, String charsToDelete):删除子字符串中任意出现的字符
String quote(String str) :在字符串前后增加单引号,比较适合在日志时候使用
本地化相关:和Locale相关的一些字符串操作
Locale parseLocaleString(String localeString): 从本地化字符串中解析出本地化信息,相当于Locale.toString()的逆向方法
//assertEquals(Locale.CHINA, StringUtils.parseLocaleString("zh_CN"));
String toLanguageTag(Locale locale):把Locale转化成HTTP中Accept-Language能接受的本地化标准;比如标准的本地化字符串为:zh_CN,更改为zh-CN
字符串和Properties:把字符串和Properties对象之间的相互转化抽取出的一些常用方法
Properties splitArrayElementsIntoProperties(String[] array, String delimiter): 把字符串数组中的每一个字符串按照给定的分隔符装配到一个Properties中
Properties splitArrayElementsIntoProperties(String[] array, String delimiter, String charsToDelete):把字符串数组中的每一个字符串按照给定的分隔符装配到一个Properties中,并删除指定字符串,比如括号之类的;
字符串和数组之间的基本操作:主要是完成字符串和字符串数组之间的基本操作,比如追加,删除,排序等
String[] addStringToArray(String[] array, String str):把一个字符串添加到一个字符串数组中
String[] concatenateStringArrays(String[] array1, String[]array2):连接两个字符串数组(交集)
String[] mergeStringArrays(String[] array1, String[] array2):连接两个字符串数组,去掉重复元素(并集)
String[] sortStringArray(String[] array):字符串数组排序
String[] toStringArray(Collection<String> collection):把字符串集合变成字符串数组
String[] toStringArray(Enumeration<String> enumeration):把字符串枚举类型变成字符串数组
String[] trimArrayElements(String[] array):把字符串数组中所有字符串执行trim功能
String[] removeDuplicateStrings(String[] array):去掉给定字符串数组中重复的元素,能保持原顺序
字符串和数组的更多方法:提供了更多字符串和数组的方法,主要涉及到字符串数组的合并,字符串的按规则拆分,字符串和集合之间的相互转化等操作
String[] split(String toSplit, String delimiter):按照指定字符串分割字符串(只分割第一次出现的)
String[] tokenizeToStringArray(String str, String delimiters):会对每一个元素按照指定字符串中的每个字符执行trim操作,并去掉空字符串,使用的是StringTokenizer完成
//打印[b, c, d]
//System.out.println(Arrays.toString(StringUtils.tokenizeToStringArray("aa,ba,ca,da", "a,")))
String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens): 后面两个参数在限定是否对每一个元素执行trim操作,是否去掉空字符串
String[] delimitedListToStringArray(String str, String delimiter): 分割字符串,会把delimiter作为整体分隔符
//打印:[a, b, c, da]
//System.out.println(Arrays.toString(StringUtils.delimitedListToStringArray("aa,ba,ca,da", "a,")));
String[] delimitedListToStringArray(String str, String delimiter, String charsToDelete):分割字符串,会把delimiter作为整体分隔符,增加一个要从分割字符串中删除的字符
//打印[a, , , da]
//System.out.println(Arrays.toString(StringUtils.delimitedListToStringArray("aa,ba,ca,da", "a,","bc")));
String[] commaDelimitedListToStringArray(String str): 使用逗号分割字符串,是delimitedListToStringArray(str, ",")的简单方法
String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix):将一个集合中的元素,使用前缀,后缀,分隔符拼装一个字符串,前缀后后缀是针对每一个字符串的
//String[] arrs=new String[]{"aa","bb","cc","dd"};
//assertEquals("{aa},{bb},{cc},{dd}", StringUtils.collectionToDelimitedString(Arrays.asList(arrs),",","{","}"))
String collectionToDelimitedString(Collection<?> coll, String delim):集合变成指定字符串连接的字符串,是collectionToDelimitedString(coll, delim, "", "")的简写
String collectionToCommaDelimitedString(Collection<?> coll):集合变成逗号连接的字符串,是collectionToDelimitedString(coll, ",");的简写;
String arrayToDelimitedString(Object[] arr, String delim):数组使用指定字符串连接
String arrayToCommaDelimitedString(Object[] arr):使用逗号连接数组,拼成字符串
PropertiesLoaderUtils:
Properties loadProperties(Resource resource) throws IOException:从一个资源文件加载Properties;
Properties loadProperties(EncodedResource resource) throws IOException:加载资源文件,传入的是提供了编码的资源类(EncodedResource);和上面方法基本一致;
void fillProperties(Properties props, Resource resource) throws IOException:从一个资源类中加载资源,并填充到指定的Properties对象中;
void fillProperties(Properties props, EncodedResource resource) throws IOException:从一个编码资源类中加载资源,并填充到指定的Properties对象中;和上面方法基本一致;
Properties loadAllProperties(String resourceName) throws IOException:根据资源文件名称,加载并合并classpath中的所有资源文件;
Properties loadAllProperties(String resourceName, ClassLoader classLoader) throws IOException:从指定的ClassLoader中,根据资源文件名称,加载并合并classpath中的所有资源文件;