如何使用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
相关产品推荐
相关产品推荐

