aop & 反射 & 缓存
有时候一些 公用属性,就想一个对象继承这个对象,这个对象里面的属性就自动赋值,这个时候就可以 用到反射(反射加上缓存 速度嘎嘎快,性能损耗微乎其微),那些方法需要赋值 用aop 切 就行。
1. 第一步定义注解 和对应的 公共类
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface SetChannelConfig {
}
@Data
public class Config {
private String url;
private String name;
private Integer id;
private Date date;
}
@Data
public class Config01 extends Config{
private String name;
}
2. 第二步定义 aop
@Component
@Aspect
@Slf4j
public class SetChannelConfigAop {
/**
* 注解切入点
*/
@Pointcut("@annotation(SetChannelConfig) || @within(SetChannelConfig)")
public void setChannelConfigPointCut(){
}
/**
* 伪造假数据
*/
Map<String,String> config = new HashMap<>();
{
config.put("url","wwww.baidu.com");
config.put("name","123456");
config.put("id","1");
config.put("date","2023-05-20 16:22:52");
}
/**
* 方法执行前执行
*
* @param joinPoint
*/
@Around("setChannelConfigPointCut()")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
Object target = joinPoint.getTarget();
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
if(args[i] instanceof Config){
Object obj = args[i];
Class<?> aClass = obj.getClass();
long startTime = System.currentTimeMillis();
Field[] fields = ReflectUtil.getFields(aClass);
log.info("反射耗时 {}",System.currentTimeMillis()-startTime);
for (int j = 0; j < fields.length; j++) {
Field field = fields[j];
String name = field.getName();
String value = config.get(field.getName());
if(!StringUtils.isBlank(name)){
String upperCase = String.valueOf(name.charAt(0)).toUpperCase();
String substring = name.substring(1);
Class<?> type = field.getType();
ReflectUtil.invoke(obj,new StringBuilder("set").append(upperCase).append(substring).toString(), Convert.convert(type,value));
}
}
}
}
return joinPoint.proceed();
}
}
image.png image.png反射方法里面的缓存
网友评论