spring aop获取目标对象的方法对象(续)
来源:互联网 发布:手机翻译软件排行 编辑:程序博客网 时间:2024/05/17 01:04
在上一篇文章中,判断目标方法上是否有注解Permission,说使用如下方式
Signature signature = pjp.getSignature(); MethodSignature methodSignature = (MethodSignature)signature; Method targetMethod = methodSignature.getMethod(); Class clazz = targetMethod.getClass(); if(clazz.isAnnotationPresent(Permission.class)){ ...}
clazz.isAnnotationPresent(Permission.class)方法返回false,然后才出了上一篇博文,博文中到最后还有个矛盾没解决,原来是这边判断方法上是否有注解出了问题,鄙视下自己
通过ProceedingJoinPoint的getSignature()方法获取Signature,然后转型成MethodSignature,然后通过MethodSignature的getMethod()方法,在目标对象没有实现接口情况下(使用cglib生成代理),getMethod()获取的Method对象其实已经是目标对象上的Method,而不是代理对象上的Method对象,至于没有获取到method对象上的Permission注解,是因为判断的时候使用的对象不对,原来判断方式是这样的:
Class clazz = targetMethod.getClass(); if(clazz.isAnnotationPresent(Permission.class)){ ...}这边又去获取了targetMethod的字节码对象,获取到得是Method类,而不是代表拦截到的目标对象的实际detail(...)这个方法Method的一个实例,这边判断是否有注解当然就返回false了,为了进一步验证
Signature signature = pjp.getSignature(); MethodSignature methodSignature = (MethodSignature)signature; Method targetMethod = methodSignature.getMethod();获取的targetMethod是目标对象上的而非代理对象上的,可以在代码中增加如下输出:
Signature signature = pjp.getSignature();MethodSignature methodSignature = (MethodSignature)signature;Method targetMethod = methodSignature.getMethod();System.out.println("target:" + targetMethod.getDeclaringClass().getName());System.out.println("targetsuper:" + targetMethod.getDeclaringClass().getSuperclass().getName());System.out.println("proxy:" + pjp.getThis().getClass().getName());System.out.println("proxysuper:" + pjp.getThis().getClass().getSuperclass().getName());测试结果:
target:com.jiangnan.cms.controller.UserControllertargetsuper:java.lang.Objectproxy:com.jiangnan.cms.controller.UserController$$EnhancerByCGLIB$$84064edfproxysuper:com.jiangnan.cms.controller.UserController其中
targetMethod.getDeclaringClass()取到的是定义这个方法的类或接口,可以理解为该方法所在的类或接口,从打印的结果可以看出targetMethod是目标对象身上的,因为其getDeclaringClass().getSuperclass().getName()是Object,如果是代理对象身上的,根据cglib生成代理对象的原则(继承目标对象,重写父类非final方法),getDeclaringClass().getSuperclass().getName()获取到得应该是其父类即com.jiangnan.cms.controller.UserController,而非java.lang.Object。
至此上一篇博文中的矛盾已经解决。
- spring aop获取目标对象的方法对象(续)
- spring aop获取目标对象的方法对象
- spring aop获取目标对象的方法对象及方法上的注解
- spring aop获取目标对象的方法对象(包括方法上的注解)
- spring aop获取目标对象的方法对象(包括方法上的注解)
- 反射..获取spring aop代理类 的目标类方法
- AOP实现拦截对象以及获取切入目标方法和注解
- Spring aop事务代理对象通过TransactionInterceptor处理目标方法事务过程,cglib方式
- Spring AOP获取Proxy对象的代码流程
- Spring AOP demo 和获取被CGLIB代理的对象
- Spring AOP:访问目标方法的参数
- (13)Spring AOP为目标对象引入新接口
- Spring Aop 目标对象内部的自我调用无法实施切面的增强处理原因
- spring aop之对象内部方法间的嵌套失效
- spring aop之对象内部方法间的嵌套失效
- Spring AOP无法拦截对象的内部方法调用问题
- 获取Spring对象的公共方法
- Spring中的AOP在Advice方法中获取目标方法的参
- Hibernate映射之多对一关联映射
- 32和64位系统占的字节(int char long double 指针等)
- 动态规划 Buy Low, Buy Lower 逢低吸纳
- fzu 2125 简单的等式
- LinkedIn 创始人:我希望当年见风投之前,我能懂得这七件事……
- spring aop获取目标对象的方法对象(续)
- A. Dima and Continuous Line
- android学习_AsyncTask(异步任务)
- delphi数据类型 非常重要!!!
- javascript学习,2nd day after Z-day
- 简易 百度云(PHP) 服务器搭建
- 程序员的那点事(转自java老师李明志)
- Windows_oracle10g_2013_10_31_管理用户的对象
- wps中制作图表目录