java吧 关注:1,221,719贴子:12,674,686
  • 29回复贴,共1

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

只看楼主收藏回复

如题,静态方法!静态方法!静态方法!重要的事情说三遍!之前在百度知道也提了问但是没有结果。
经测试,目前得知:“普通方法”可以使用AspectJ 或者spring-aop进行代理增强;“静态方法”可以使用java反射模拟实现切面编程。利用java反射机制,在Method的invoke()前后进行拦截处理即可。
然而使用java的反射机制,只能“主动”进行拦截处理,因为无法设置切入点监听静态方法执行,必须主动调用指定的静态方法,无法像spring-aop一样,只要方法被调用,可以被监听到,“被动”地进行拦截处理。
现在还需要研究一下是否能实现与spring-aop类似的功能,利用注解等形式在静态方法被调用时触发拦截。
或者有没有什么办法可以监控java任意或指定静态函数的调用?类似于添加Listener,只要指定静态函数被调用,即可被监听到?


IP属地:云南1楼2022-07-21 09:56回复
    java反射invoke()代码示例为(直接放代码老说违规):





    IP属地:云南2楼2022-07-21 10:01
    回复


      IP属地:云南3楼2022-07-21 10:04
      收起回复


        IP属地:云南7楼2022-07-21 17:54
        回复
          太难了


          IP属地:云南8楼2022-07-22 09:44
          回复
            想要代理静态方法就要代理类对象,就是说要在类加载器上做文章,工作中没人这么干的
            powermock有一个类似的功能,你搜一下mock static


            来自手机贴吧10楼2022-08-02 10:21
            收起回复
              静态方法的设计就是让你能通过类去直接调用,都绕过对象了还搞啥切面?直接手动调用不就行了?


              IP属地:辽宁来自Android客户端11楼2022-08-08 13:39
              收起回复


                IP属地:云南12楼2022-08-10 11:24
                回复
                  痛苦


                  IP属地:云南来自iPhone客户端18楼2022-08-10 15:47
                  回复
                    其实就是在一个类的doService()方法里直接调用


                    IP属地:云南19楼2022-08-10 15:51
                    收起回复
                      可以考虑你楼上的方案,建一个同路径的类吧,重写你的方法,会优先加载本地的


                      IP属地:广东来自Android客户端20楼2022-08-15 02:06
                      收起回复