Ph-苯
本帖最后由 Ph-苯 于 2021-11-19 20:33 编辑

重定向器(@Redirect)支持重定向字段的访问(GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC),其中,重定向获取值比较好理解,即把从字段获取值重定向到一个方法,返回一个和字段相同类型的值;但是重定向赋值所需的方法却返回void,这表明该重定向不是修改所赋的值。如果重定向一个final字段的赋值(即初始化),但是在代码里面给final字段重新赋值会报编译错误,要想修改final字段就得加上@Mutable注解,这会把final字段变成了非final字段,对原本的类产生了破坏性的修改。

我之前理解的赋值重定向器是把这个:
  1. field = expression;
复制代码
变成这个:
  1. field = callback(expression);
复制代码
但是实际上,好像是变成这个:
  1. callback(expression);
复制代码

似乎不能通过重定向来更改final字段的初始化值。

火车撞鸟
本帖最后由 火车撞鸟 于 2021-11-18 21:41 编辑

@Redirect 所注解的方法为什么不能有其他返回值类型呢?而且返回值类型为 void 的 Redirect 方法只会被注入到 GETFIELD 或 GETSTATIC 的地方去,要注入到 PUTFIELD 或者 PUTSTATIC 的地方只能用带返回值的方法

private static XXX resetABC() { return xxx; } 是完全可用的

第一页 上一页 下一页 最后一页