本帖最后由 Ph-苯 于 2021-11-19 20:33 编辑
重定向器(@Redirect)支持重定向字段的访问(GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC),其中,重定向获取值比较好理解,即把从字段获取值重定向到一个方法,返回一个和字段相同类型的值;但是重定向赋值所需的方法却返回void,这表明该重定向不是修改所赋的值。如果重定向一个final字段的赋值(即初始化),但是在代码里面给final字段重新赋值会报编译错误,要想修改final字段就得加上@Mutable注解,这会把final字段变成了非final字段,对原本的类产生了破坏性的修改。
我之前理解的赋值重定向器是把这个:复制代码变成这个:复制代码但是实际上,好像是变成这个:复制代码
似乎不能通过重定向来更改final字段的初始化值。
重定向器(@Redirect)支持重定向字段的访问(GETFIELD, PUTFIELD, GETSTATIC, PUTSTATIC),其中,重定向获取值比较好理解,即把从字段获取值重定向到一个方法,返回一个和字段相同类型的值;但是重定向赋值所需的方法却返回void,这表明该重定向不是修改所赋的值。如果重定向一个final字段的赋值(即初始化),但是在代码里面给final字段重新赋值会报编译错误,要想修改final字段就得加上@Mutable注解,这会把final字段变成了非final字段,对原本的类产生了破坏性的修改。
我之前理解的赋值重定向器是把这个:
- field = expression;
- field = callback(expression);
- callback(expression);
似乎不能通过重定向来更改final字段的初始化值。
本帖最后由 火车撞鸟 于 2021-11-18 21:41 编辑
@Redirect 所注解的方法为什么不能有其他返回值类型呢?而且返回值类型为 void 的 Redirect 方法只会被注入到 GETFIELD 或 GETSTATIC 的地方去,要注入到 PUTFIELD 或者 PUTSTATIC 的地方只能用带返回值的方法
private static XXX resetABC() { return xxx; } 是完全可用的
@Redirect 所注解的方法为什么不能有其他返回值类型呢?而且返回值类型为 void 的 Redirect 方法只会被注入到 GETFIELD 或 GETSTATIC 的地方去,要注入到 PUTFIELD 或者 PUTSTATIC 的地方只能用带返回值的方法
private static XXX resetABC() { return xxx; } 是完全可用的