java中的静态方法能否进行切面编程?

如题,静态方法!静态方法!静态方法!重要的事情说三遍!

经测试,已有结论:“普通方法”可以使用AspectJ 或者spring-aop进行代理增强;“静态方法”可以使用java反射模拟实现切面编程。利用java反射机制,在Method的invoke()前后进行拦截处理即可。

然而使用java的反射机制,只能“主动”进行拦截处理,因为无法设置切入点监听静态方法执行,必须主动调用指定的静态方法,无法像spring-aop一样,只要方法被调用,可以被监听到,“被动”地进行拦截处理。

现在还需要研究一下是否能实现与spring-aop类似的功能,利用注解等形式在静态方法被调用时触发拦截。

java反射invoke()代码示例为如图所示(字数超了,只能放图了):

静态方法没有实例,不能进行切面。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-07-02
aop的事务代理机制最重要的放心是确定切入点,面,通知.具体看代码,下面是在spring中配置的我自己写的一个异常处理的aop作用类 ,该配置切入面在于在controller包下的所有类的所有注解为aspect的切面类,通知类型为表示在目标方法之前切入,切入点为controller包下的所有类所有方法.至于楼主所说的静态方法对于事务机制应该没什么区别吧,只要用within方法一样可以的

<!-- 定义共同处理组件 -->
<bean id="loggerBean"
class="org.tedu.cloudnote.aspect.LoggerBean">
</bean>
<!-- 将loggerBean组件切入到Controller方法上 -->
<aop:config>
<!-- 要切入哪个共同处理组件,ref指定共同组件id值 -->
<aop:aspect ref="loggerBean">
<!-- aop:before表示在目标方法之前切入,
method指定方法名;pointcut指定目标组件 -->
<aop:before method="logController"
pointcut="within(org.tedu.cloudnote.controller..*)"/>
</aop:aspect>
第2个回答  2022-08-29
aop的事务代理机制最重要的放心是确定切入点,面,通知.具体看代码,下面是在spring中配置的我自己写的一个异常处理的aop作用类 ,该配置切入面在于在controller包下的所有类的所有注解为aspect的切面类,通知类型为表示在目标方法之前切入,切入点为controller包下的所有类所有方法.至于楼主所说的静态方法对于事务机制应该没什么区别吧,只要用within方法一样可以的

<!-- 定义共同处理组件 -->
<bean id="loggerBean"
class="org.tedu.cloudnote.aspect.LoggerBean">
</bean>
<!-- 将loggerBean组件切入到Controller方法上 -->
<aop:config>
<!-- 要切入哪个共同处理组件,ref指定共同组件id值 -->
<aop:aspect ref="loggerBean">
<!-- aop:before表示在目标方法之前切入,
method指定方法名;pointcut指定目标组件 -->
<aop:before method="logController"
pointcut="within(org.tedu.cloudnote.controller..*)"/>
</aop:aspect>