Java 实现 动态更改注解
Posted 辉常努腻
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 实现 动态更改注解相关的知识,希望对你有一定的参考价值。
学习java第150天,使用反射+动态代理+爆破 实现动态更改注解
话不多说篇-直接干代码
// 根据运行环境设置表名
String tableName = "execution(* *..SomeServiceImpl.doThird(..))";
// 获取 MyAspect 上的 Pointcut 注解
Pointcut annoPoincut = MyAspect.class.getMethod("myPointCut").getAnnotation(Pointcut.class);
//获取 MyAspect 上的 Aspect 注解
Aspect annoAspect = MyAspect.class.getAnnotation(Aspect.class);
//判断是否为空
if (annoPoincut == null) {
throw new RuntimeException("please add @Table for Test");
}
// 获取代理处理器
InvocationHandler invocationHandler = Proxy.getInvocationHandler(annoPoincut);
// 过去私有 memberValues 属性
Field f = invocationHandler.getClass().getDeclaredField("memberValues");
//设置方法或类为可访问
f.setAccessible(true);
// 获取实例的属性map
Map<String, Object> memberValues = (Map<String, Object>) f.get(invocationHandler);
//输出注解
memberValues.forEach( (s, o) -> System.out.println(s + "\\t" +o +"\\n"));
// 修改属性值 随意修改属性值
memberValues.put("value",tableName);
导包
import com.li.bao08.MyAspect;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Map;
以上是关于Java 实现 动态更改注解的主要内容,如果未能解决你的问题,请参考以下文章
基于NACOS和JAVA反射机制动态更新JAVA静态常量非@Value注解