我对 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
无济于事。
简单的答案:你想要的在 AspectJ 中是不可能的。局部变量无法操作,只能操作
您还可以做一些其他事情,但我不会在这里列出。
出现语法错误的原因是 AspectJ 不喜欢您的幻想语法。
within
用于类型,而不是方法。对于方法拦截,您还有其他切入点类型,例如 call
和 execution
。此外,您不能像在源代码中那样,仅像 .createClaimButton().clicked()
那样链接方法调用。在字节码中,这是两个单独的方法调用。
我建议学习 AspectJ 基础知识。从现有的例子开始,尝试理解它们。不要只是发明用例和语法。这对你没有多大帮助。