杂乱代码,常用:
1.获取当前实现类的泛型类
Type[] types = this.getClass().getInterfaces()[0].getGenericInterfaces();
for(Type type1 : types){
if(type1.getTypeName().indexOf(GeneralVouchersManager.class.getName()) != -1){
Class<?> clazz = (Class<?>)((ParameterizedType) type1).getActualTypeArguments()[0];
}
}
2.断言
举例 比如在接口中:
default boolean havePreVouchers(T query) throws Exception{
return getCompareResult(query,(a,b) -> a > b);
}
default boolean haveNextVouchers(T query) throws Exception{
return getCompareResult(query,(a,b) -> a < b);
}
区别只是判断方式不同 所以提取出来公共部分 判断方式以断言形式传入
default boolean getCompareResult(T query,BiPredicate<Integer,Integer> biPredicate) throws Exception {
T result = this.getGeneralVouchersBO(query);
if(result == null){
return false;
}
Field[] fields = result.getClass().getDeclaredFields();
for(Field f : fields){
Type genericType = f.getGenericType();
if (List.class.isAssignableFrom(f.getType()) && genericType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) genericType;
Class<?> accountPrincipalApproveClazz = (Class<?>) pt.getActualTypeArguments()[0];
if(AbstractVouchersBO.class.isAssignableFrom(accountPrincipalApproveClazz)){
PropertyDescriptor pde = new PropertyDescriptor(f.getName(), result.getClass());
Method rme = pde.getReadMethod();
List<?> list = (List<?>) rme.invoke(result);
if(ListUtils.isNotEmpty(list)){
String prefix = classMap.get(accountPrincipalApproveClazz.getSimpleName());
if(biPredicate.test(StringUtils.getCharacterTimes(this.getPrefix(),DELIMITER),StringUtils.getCharacterTimes(prefix,DELIMITER))){
return true;
}
}
}
}
}
return false;
}