当前位置: 首页 > 知识库问答 >
问题:

使用aspectJ拦截静态方法[重复]

陈功
2023-03-14

我正在使用Spring并试图用AspectJ编写示例应用程序。我需要学习如何拦截静态方法调用。在我的示例中,我尝试截取main方法,如下所示:

Spring配置文件:

<aop:aspectj-autoproxy />

<!-- Aspect -->
<bean id="logAspect" class="com.package.Aspect" />

主要方法:

public class App {
    public static void main(String[] args) throws Exception {

        ApplicationContext appContext = new ClassPathXmlApplicationContext("Spring-Customer.xml");

        System.out.println("str");
    }
}

协会本身:

@Aspect
public class Aspect {
    @Around("execution(*App.main(..))")
    public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Intercepted!");
    }

}

但是当我运行应用程序时,唯一的str字符串正在打印。

共有1个答案

姜鸿畴
2023-03-14

您使用的是在运行时创建代理对象的动态代理方法。此代理对象将继承用于代理目标方法。由于不能继承静态方法,因此这种方法不适用于静态方法。

要为静态方法创建代理,需要使用AspectJ的编译时编织。您可以参考此链接了解更多信息。这可能也有帮助。

 类似资料:
  • 我正在具体的类上创建动态代理。因为Java的普通代理类只对接口有帮助,所以我选择了cglib。 我使用带有MethodInterceptor的增强器类来拦截我的代理的方法,我能够拦截除静态方法之外的所有方法调用。 有什么方法可以使用cglib拦截对静态方法的调用吗?

  • 问题内容: 主题行基本上说明了一切。我有一个静态方法要拦截,以便可以将周围的建议应用于该方法。我可以使它与任何非静态方法一起使用,但是我不确定如何允许静态方法被拦截。 问题答案: 使用Spring AOP不能做到这一点,因为它是基于代理的。您必须使用AspectJ。看一个简单的例子:http : //blog.jayway.com/2007/02/16/static-mock-using- asp

  • 本文向大家介绍详解springmvc拦截器拦截静态资源,包括了详解springmvc拦截器拦截静态资源的使用技巧和注意事项,需要的朋友参考一下 springmvc拦截器interceptors springmvc拦截器能够对请求的资源路径进行拦截,极大的简化了拦截器的书写。但是,千万千万要注意一点:静态资源的放行。 上代码: 问题来了,在请求jsp页面的时候,你的静态资源的访问仍然会被自定义拦截器

  • 我试图让aspectj拦截带注释的方法: 我删除了!为了简洁起见,在(InterceptMeAspect)内,但它并没有拦截太多。如果我删除注释约束(在(@InterceptMe*)内),它可以工作,但会拦截所有内容,这会造成一个大问题。 输出字节码似乎有完整的注释,所以我希望注释标准匹配。我正在或试图进行编译时编织。这很重要,因为我有另一个方面确实使用上面相同的方法工作。我怀疑该方面正在搞乱这个

  • 我正在使用AeyJ拦截一个名为的方法。为此,我使用了我自己指定的(标记)注释。这就是类的样子: 截取截取注释的方面: 然而,我的方面是基于带注释的参数进行拦截。但我希望方面能够拦截参数t包含的特定值的方法请求。 例如,如果t==“t1”,则必须截取该方法,否则不能截取。 我想知道是否可以在AeyJ(与Spring AOP结合使用)中做到这一点。