You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AspectJ修改方法内部变量?求助

问题分析与解决方案

1. 核心错误点

你编写的AspectJ代码存在两个关键问题:

  • 切点语法完全错误:within()用于匹配类/包范围,不能直接写方法签名,内部类方法的匹配需要结合execution和withincode关键字
  • 混淆了方法参数与局部变量:你用args[1]修改值的逻辑错误,clicked()方法没有参数,args数组为空,会触发数组越界

2. 正确的AspectJ实现方案

针对目标代码中createClaimButton()方法内的clicked()方法,以及其中的int total = 8变量赋值,提供两种可行方案:

方案一:直接拦截变量赋值操作(推荐)

精准匹配total变量被赋值为8的操作,直接替换赋值结果:

@Aspect
public class moreShipPointAspect {
    // 匹配createClaimButton()方法内的clicked()方法中,total变量被赋值为8的操作
    @Pointcut("set(int *.total) && args(8) && withincode(void *.clicked()) && withincode(void fi.bugbyte.spacehaven.GUI.SelectedElements.createClaimButton())")
    public void totalAssignment() {}

    @Around("totalAssignment()")
    public Object replaceTotalValue(ProceedingJoinPoint pjp) throws Throwable {
        // 返回新值替换原来的8
        return 128;
    }
}

方案二:拦截clicked()方法执行(备选)

如果方案一因匿名内部类的类名问题不生效,可拦截整个clicked()方法,通过AspectJ API修改局部变量:

@Aspect
public class moreShipPointAspect {
    // 匹配createClaimButton()方法内的所有clicked()方法执行
    @Pointcut("execution(void *.clicked()) && withincode(void fi.bugbyte.spacehaven.GUI.SelectedElements.createClaimButton())")
    public void clickedMethod() {}

    @Around("clickedMethod()")
    public void modifyTotalInClicked(ProceedingJoinPoint pjp) throws Throwable {
        // 若需要直接操作局部变量,可通过AspectJ的LocalVariable API实现
        // 此场景下方案一更简洁,故此处仅保留方法执行流程
        pjp.proceed();
    }
}

3. 额外注意事项

  • 若clicked()是某个已知接口的实现方法(比如ClickListener.clicked()),可直接用execution(void fi.bugbyte.spacehaven.GUI.ClickListener.clicked())作为切点,匹配更精准
  • 确保AspectJ织入配置正确,游戏Mod的类加载器能识别并加载你的切面类

内容的提问来源于stack exchange,提问作者Zemogiter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:37:42