//在mapper文件执行之前,处理数据,将所有的空值置为null
//joinPoint是aspect切面的对象
Arrays.asList(joinPoint.getArgs()).forEach(v->{
//取得对象里面的所有属性
Field[] declaredFields = v.getClass().getDeclaredFields();
Arrays.stream(declaredFields).forEach(k->{
//获取属性的名字
String name = k.getName();
System.out.println("属性名:"+name);
try {
if(java.lang.reflect.Modifier.isFinal(k.getModifiers())){
System.out.println("字段:"+name+"使用final修饰");
return;
}
}catch(Exception e){
throw new RuntimeException(e);
}
//getType(): 获取属性声明时类型对象(返回class对象)
//
//getGenericType() : 返回属性声的Type类型
//
//getType() 和 getGenericType()的区别 :
//
//1.首先是返回的类型不一样,一个是Class对象一个是Type接口。
//
//2.如果属性是一个泛型,从getType()只能得到这个属性的接口类型。但从getGenericType()还能得到这个泛型的参数类型。
//
//3.getGenericType()如果当前属性有签名属性类型就返回,否则就返回 Field.getType()。
String type = k.getGenericType().toString(); //获取属性的类型
System.out.println("属性的类型为:"+type);
Class<?> Tclass = k.getType();
name = name.substring(0,1).toUpperCase()+name.substring(1); //将属性的首字符大写,方便构造get,set方法
try {
//获取get方法
Method m = v.getClass().getMethod("get"+name);
System.out.println("get方法名为:"+m);
//获取set方法
//在此之前需要判断该属性的类型,由此判断该传入哪一类的class
Method method = v.getClass().getDeclaredMethod("set"+name, Tclass);
System.out.println("set方法名为:"+method);
Object invoke = m.invoke(v);
System.out.println("获取元素的值:"+invoke);
if("".equals(invoke)){
method.invoke(v, (Object) null);
}
//此为测试方法,测试aop是否能正常启动事务(结果为能正确启动)
// if(new Integer(25).equals(invoke)){
// throw new Exception("测试");
// }
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
});
});
在aspect切面中反射的部分运用
最新推荐文章于 2023-03-05 15:05:10 发布