- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想记录类列表(可能属于不同的包)中所有方法的条目。请注意,这些方法应该只属于指定的类。
我试过以下方法,但这些都不起作用
(1) 使用 if() 切入点这里报错
"incompatible number of arguments to pointcut, expected 1 found 0"
@Pointcut("execution(*.*(..)) && if()")
public static boolean mycut(JoinPoint jp) {
boolean matches = ... ;//Test using jp if the declaring class belongs to the list
return matches;
}
(2) 切入点与aop.xml结合使用这里报错
java.lang.NoSuchMethodError:
com.mypackage.TraceAspect.aspectOf()Lcom/df/jc/aspect/TraceAspect;
//in com.mypackage.TraceAspect aspect class
@Pointcut("execution(*.*(..)) && !within(com.mypackage.TraceAspect)")
public void mycut(){
}
//in aop.xml
<weaver>
<include within="package1.Class1">
<include within="package2.Class2">
<include within="package3.Class3">
</weaver>
这里出了什么问题?
当然可以通过在切入点中单独指定每个类来完成,但这对于数百个类来说是不可扩展的。理想情况下,如果可以从外部文本文件中获取类列表(以便于配置),那就太好了
最佳答案
至于你最后的评论:除了糟糕的设计,我并没有劝阻你做任何事情,我只是想鼓励你做正确的事:重构,不要让自己的生活变得比必要的更艰难。您甚至不了解 AspectJ 语法基础知识,但您已经想要实现具有大量类的过于复杂的场景,这是维护的噩梦。我试图通过激励你不要做出短视的决定来提供帮助。相信我,多年来我一直在使用 AspectJ 进行所谓的具有大量遗留代码的真实项目。避免即使是最便宜的重构也比进行智能重构要昂贵得多——不是太多,但根据童子军规则就足够了:让营地比你发现时更干净。这是有返回的,相信我。
无论如何,谈谈你的代码片段:
execution(*.*(..))
在语法上是错误的,因为您没有为要匹配的方法指定返回类型(或它的占位符)。您想使用 execution(* *.*(..))
或简写版本 execution(* *(..))
。@Before("mycut()")
的内容,但正确的应该是 @Before("mycut(jp)")
。话虽如此,这里是一个简单、完全独立且可编译的示例:
司机申请:
package de.scrum_master.app;
public class Application {
public static void main(String[] args) {
System.out.println(multiply(3, add(4, 5)));
}
public static int multiply(int i, int j) { return i * j; }
public static int add(int i, int j) { return i + j; }
}
看点:
package de.scrum_master.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class TraceAspect {
@Pointcut("execution(* *(..)) && if()")
public static boolean hasMatchingSignature(JoinPoint thisJoinPoint) {
return !thisJoinPoint.getSignature().getName().equals("main");
}
@Before("hasMatchingSignature(thisJoinPoint)")
public void myAdvice(JoinPoint thisJoinPoint) {
System.out.println(thisJoinPoint);
}
}
示例输出:
execution(int de.scrum_master.app.Application.add(int, int))
execution(int de.scrum_master.app.Application.multiply(int, int))
27
如果您的 if()
切入点只返回 true
,输出也会显示 main
的执行。
关于aop - 类列表的所有方法上的 AspectJ 切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23527469/
我正在使用 aspectj 来拦截用 @Profile(description="something") 注释的方法 @Retention(RetentionPolicy.RUNTIME) @Targ
我对 Spring AOP 中的所有类都有一个切入点,例如 @Pointcut("执行(* com.company.app..*(..))") 现在我需要排除一个类 com.company.app.I
我对 Spring AOP 中的所有类都有一个切入点,例如 @Pointcut("执行(* com.company.app..*(..))") 现在我需要排除一个类 com.company.app.I
我想知道以下内容在切入点中意味着什么 after(FigureElement fe, int x, int y) returning: call(void FigureElement.
在开始之前,我想澄清一下,我目前对 AOP 术语的理解如下...... 方面是 AOP 等同于 OOP 中的类。 通知是 AOP 等价于 OOP 中的方法。 切入点是 AOP 等价于 OOP 中的“使
我将参与 android 设备驱动程序的开发。在准备过程中,我想掌握基础知识并为此提高我的技能。 过去 2 年我一直在使用 VB 和 JAVA,所以我对自己的 C 编程没有信心。 Linux 设备驱动
我想记录类列表(可能属于不同的包)中所有方法的条目。请注意,这些方法应该只属于指定的类。 我试过以下方法,但这些都不起作用 (1) 使用 if() 切入点这里报错 "incompatible numb
我正在使用 @AspectJ 样式来编写方面,以处理我们应用程序中的日志记录。基本上我有一个像这样设置的切入点: @Pointcut("call(public * com.example..*(..)
例如我有以下方法: public void method1(@MyAnnotation Object a, Object b..) { ... } public void method1(Obj
我正在寻找一种围绕类级别变量指定切入点的方法。像这样的东西: @Target(ElementType.METHOD) @Retention(RetentionPolicy.FIELD) @interf
如何编写一个切入点来触发方法,例如MyClass 上的所有 setter 都被执行,但该方法缺少一些特定的注释,例如@Ann1 和 @Ann2 最佳答案 import java.lang.annota
我在让各个方面正常工作时遇到一些问题。由于某种原因,它们似乎只有在我真正了解该方面的应用位置时才起作用。在四个切入点/建议中,只有最后一个匹配并输出任何内容。我在这里缺少什么? public aspe
我是 Spring AOP 触发器的新手。我的代码中有以下切入点触发器。当定义了所有四个切入点时,只有第一个切入点触发器 (com.src.a()) 正在工作,下面的其余切入点不会触发。但是当我在四个
使用加载时编织,纯 AspectJ。 我们有 2 个注释 @Time 和 @Count,以及一些带注释的方法。 @Time (name="myMethod1Time") @Count (name="m
这个问题已经有答案了: Java Aspect returned value to be used in the method (1 个回答) 已关闭 6 年前。 我想要 AOP 记录方法的返回值
我正在尝试围绕使用自定义注释注释的方法定义切入点。注释有一个参数,我想在切入点定义中包含一个检查。 这是注释: public @interface MyAnno { String[] types;
我正在使用 Spring AOP 进行日志记录。我想创建一个适用于除具有特定注释的方法之外的所有方法的切入点,但我不知道如何去做。我所发现的只是如何包含带有注释的方法。 最佳答案 示例注释: pack
/* 0 */ pointcut services(Server s): target(s) && call(public * *(..)) This pointcut, named services
我需要使用 AspectJ 向每个初始化对象注入(inject)一些方法。 我想用这个: pointcut vistaInjection(Object o) : initialization(
假设我有这样的方法: public void method(@CustomAnnotation("value") String argument) 是否有一个切入点表达式可以选择所有带有 @Custo
我是一名优秀的程序员,十分优秀!