如何使用 AspectJ 更改方法内的值

问题描述 投票:0回答:1

我对 AspectJ 还不太熟悉,我一直在尝试修改一些用 Java 编写的游戏(Space Haven)。为了实现我想要的,我必须更改 int 变量。

这是代码片段:

private void createClaimButton() {
  //some code here
        public void clicked() {
          boolean canClaim = false;
          int total = 8; <- I want to change this value
          } 
        //some code here

我试过这个:

@Aspect
public abstract class moreShipPointAspect {
@Pointcut("within(public void fi.bugbyte.spacehaven.GUI.SelectedElements.createClaimButton().clicked())")
public abstract void clicked();

@Around("clicked()")
public void replaceValue(ProceedingJoinPoint pjp) throws Throwable {
    Object[] args = pjp.getArgs();
    args[1] = 128;
    pjp.proceed(args);
    }
}

但是在编译 mod 时我收到此错误:

[ERROR]C:\Users\user\SpaceHavenModTemplate\src\main\java\com\zemogiter\MoreShipPoints\moreShipPointAspect.java:10:0::0 Syntax error on token "within(public void fi.bugbyte.spacehaven.GUI.SelectedElements.createClaimButton().clicked())", ")" expected

从我读到的内容来看,我的切入点似乎有些问题,我尝试了

call
execution
within
无济于事。

java aspectj
1个回答
0
投票

简单的答案:你想要的在 AspectJ 中是不可能的。局部变量无法操作,只能操作

  • 字段读/写访问,
  • 方法/构造函数调用及其输入参数和/或结果。

您还可以做一些其他事情,但我不会在这里列出。

出现语法错误的原因是 AspectJ 不喜欢您的幻想语法。

within
用于类型,而不是方法。对于方法拦截,您还有其他切入点类型,例如
call
execution
。此外,您不能像在源代码中那样,仅像
.createClaimButton().clicked()
那样链接方法调用。在字节码中,这是两个单独的方法调用。

我建议学习 AspectJ 基础知识。从现有的例子开始,尝试理解它们。不要只是发明用例和语法。这对你没有多大帮助。

© www.soinside.com 2019 - 2024. All rights reserved.