gpt4 book ai didi

java - 应用多个方面是否安全?

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

假设我们有两个方面:

public aspect TestAspect {
pointcut publicMethodExecuted(): execution(public !static * *(..));

int around() : publicMethodExecuted() {
System.out.println("Test string");
Object[] args = thisJoinPoint.getArgs();
System.out.println(args[0]);
int original_return_value = proceed();
return original_return_value * 100;
}
}

public aspect AnotherTestAspect {
pointcut anotherPublicMethodExecuted(): execution(public !static * *(..));

int around() : anotherPublicMethodExecuted() {
System.out.println("Another Test string");
Object[] args = thisJoinPoint.getArgs();
System.out.println(args[0]);
}
}

正如你所看到的,这两个方面有着完全相同的切入点。因此他们拦截相同的方法调用。这样做安全吗?

请不要建议我将所有这些放在同一方面。我询问的是 AspectJ 工作原理和潜在的可能性。

最佳答案

简单的答案是“是的,但是......”

简单来说,AspectJ 所做的基本上就是切入点到切入点并搜索如何编织它,然后,好吧,编织它。在同一方法有两个切入点的情况下,其中一个切入点将进行编织,然后另一个切入点将进行编织,并且基本上会覆盖第一个编织。 除非第二个切入点继续!

让我用一个简短的例子来解释这一点。假设您有以下类(class):

public class TestClass {

public static void main(String... args) {
new TestClass().x();
}

public void x() {
System.out.println("Hello, world!");
}
}

现在让我们定义一个方面:

public aspect FirstAspect {

public pointcut hello1() : execution(void mypackage.TestClass.x());
void around() : hello1() {
System.out.println("first");
}

}

将会发生的是,方面将编织方法x,基本上用 AspectJ 创建的方法替换对 x 的调用。

现在让我们假设我们有另一个方面:

public aspect SecondAspect {

public pointcut hello2() : execution(void mypackage.TestClass.x());
void around() : hello2() {
System.out.println("second");
}

}

不失一般性并且为了保持一致,我们假设首先编织 FirstAspect。那时,我们得到的结果与之前相同。但是现在 AspectJ 继续并编织了SecondAspect。它找到方法 x() 并用新方法替换其执行(或调用,具体取决于切入点类型),有效地覆盖先前的编织并使其过时(讽刺的是,第一个编织代码保留但无用)。

但是,如果 SecondAspect 的建议在任何时候调用 proceed(),那么它将继续执行的部分实际上是首先编织。那是因为它是编织的,就 AspectJ 而言,这就是 x 正在做的事情。

试试这个。您将看到只有一个切入点实际上是左编织的:您只会得到一个打印:firstsecond,但不会两者兼而有之,除非您继续这样做:

 System.out.println("second");
proceed();

什么时候proceed()并不重要,只要你这样做:

 proceed();
System.out.println("second");

如果你想确保先编织哪个切入点,可以查看AspectJ优先级声明

关于java - 应用多个方面是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30507930/

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