最近在写一些关于redis的AOP代码,需要用到反射来进行切面编程,特此记录。
其中strRedisTemplate是一个bean(StringRedisTemplate),methodName为leftPushAll或者rightPushAll,里面有redis的相关配置,此处就不详细介绍了。
public void common(String methodName,String listName,List<String> value) {
try {
Class c=strRedisTemplate.opsForList().getClass();
Constructor constructor=c.getDeclaredConstructors()[0];//由于该类c为保护类,且构造方法只有一个(带参),所以直接获取
constructor.setAccessible(true);
Object obj=constructor.newInstance(strRedisTemplate);
constructor.setAccessible(false);
Method method=c.getDeclaredMethod(methodName,Object.class, Collection.class);
method.setAccessible(true);
method.invoke(obj,listName,value);
method.setAccessible(false);
} catch (Exception e) {
logger.error("list invoke error {}",e.getMessage());
}
}
引用
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
在反射对象中设置 accessible 标志允许具有足够特权的复杂应用程序(比如 Java Object Serialization 或其他持久性机制)以某种通常禁止使用的方式来操作对象。