gpt4 book ai didi

java - 扩展类中方法的方面不起作用

转载 作者:行者123 更新时间:2023-12-02 09:04:00 25 4
gpt4 key购买 nike

我尝试将方面应用于抽象类中的两个方法,这些方法由另一个类扩展。

问题是我使用的切入点不起作用。

代码如下所示:

public class ClassA extends ClassB {

public void testMethod(String testString, Integer testInt){
extendedClassMethod1(testString, testInt);
extendedClassMethod2(testString, testInt);
}
}

public abstract class ClassB {

public String extendedClassMethod1(String testString, Integer testInteger) {
return testString + testString.toString();
}

public String extendedClassMethod2(String testString, Integer testInteger) {
return testString + testString.toString();
}
}

@Aspect
public class AspectClass {

@AfterReturning(
value = "execution(* com.test.ClassB.*(..)) && args(testString, testInteger)",
returning = "result")
public void aspectMethod(JoinPoint joinPoint, String testString, Integer testInteger, String result){
// do something
}
}

目标是创建当在扩展 ClassB 的类(例如 ClassA)中使用扩展类方法 1 或扩展类方法 2 时将起作用的方面。

另一件事是,Intellij 表明切面方法应该应用于这两个方法,但在运行时却没有。

最佳答案

我评论过:

If you really use AspectJ (e.g. via load-time weaving configuration) and not Spring AOP, it works as you wish. If it does not work, you are not using AspectJ. It is as simple as that. If you want to challenge my statement, just provide an MCVE incl. Maven POM and ideally on GitHub, so I can just clone and run the application, e.g. via Spring Boot. BTW, in order to make this work with POJOs you don't need Spring at all. I tested your code outside of Spring.

为了支持我的说法,这是我使用 POJO + AspectJ 的 MCVE:

基类(为什么要抽象,因为没有抽象方法):

package de.scrum_master.app;

public abstract class ClassB {
public String extendedClassMethod1(String testString, Integer testInteger) {
return testString + " / " + testInteger.toString();
}

public String extendedClassMethod2(String testString, Integer testInteger) {
return testString + " / " + testInteger.toString();
}
}

(具体)子类:

package de.scrum_master.app;

public class ClassA extends ClassB {
public void testMethod(String testString, Integer testInt) {
extendedClassMethod1(testString, testInt);
extendedClassMethod2(testString, testInt);
}
}

驱动程序应用程序:

package de.scrum_master.app;

public class Application {
public static void main(String[] args) {
ClassA classA = new ClassA();
classA.extendedClassMethod1("eleven", 11);
classA.extendedClassMethod2("twenty-two", 22);
classA.testMethod("thirty-three", 33);
}
}

方面:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AspectClass {
@AfterReturning(
value = "execution(* de.scrum_master.app.ClassB.*(..)) && args(testString, testInteger)",
returning = "result"
)
public void aspectMethod(JoinPoint joinPoint, String testString, Integer testInteger, String result) {
System.out.println(joinPoint);
System.out.println(" testString = " + testString);
System.out.println(" testInteger = " + testInteger);
System.out.println(" result = " + result);
}
}

控制台日志:

execution(String de.scrum_master.app.ClassB.extendedClassMethod1(String, Integer))
testString = eleven
testInteger = 11
result = eleven / 11
execution(String de.scrum_master.app.ClassB.extendedClassMethod2(String, Integer))
testString = twenty-two
testInteger = 22
result = twenty-two / 22
execution(String de.scrum_master.app.ClassB.extendedClassMethod1(String, Integer))
testString = thirty-three
testInteger = 33
result = thirty-three / 33
execution(String de.scrum_master.app.ClassB.extendedClassMethod2(String, Integer))
testString = thirty-three
testInteger = 33
result = thirty-three / 33

关于java - 扩展类中方法的方面不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59966405/

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