gpt4 book ai didi

aop - 类列表的所有方法上的 AspectJ 切入点

转载 作者:行者123 更新时间:2023-12-05 05:26:49 28 4
gpt4 key购买 nike

我想记录类列表(可能属于不同的包)中所有方法的条目。请注意,这些方法应该只属于指定的类。

我试过以下方法,但这些都不起作用

(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(* *(..))
  • 错误“切入点的参数数量不兼容,期望 1 找到 0”不是来自您的切入点,而是来自您甚至懒得发布的建议。您一定写了类似 @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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com