学习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;