利用反射更改属性值

1 利用反射更改private字段值

public class ReflectTest {

    private static String sTestOne = "Origin";

    public static String getTestOne() {
        return sTestOne;
    }
}
try {
        Field field = ReflectTest.class.getDeclaredField("sTestOne");
        field.setAccessible(true);
        field.set(null, "Modified");
        Log.d(TAG, "sTestOne = " + ReflectTest.getTestOne());
    } catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
    }

输出结果:

2021-05-21 15:33:43.162 24389-24389/com.example.demo D/Charlie: sTestOne = Modified

2 利用反射更改final字段的值

这里Field的字段名称在新版本的Android中有更改,网上Field类中modifiers字段的说明是这样的:Field对象有个一个属性叫做 modifiers, 它表示的是属性是否是 public, private, static, final 等修饰的组合,而查阅Android 30源码发现字段名称改为了accessFlags

private static final String sTestTwo = new String("Origin");
try {
    	Field field = ReflectTest.class.getDeclaredField("sTestTwo");
    	Field modifiersField = Field.class.getDeclaredField("accessFlags");
    	modifiersField.setAccessible(true);
    	modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    	field.setAccessible(true);
    	field.set(null, "Modified");
    	Log.d(TAG, "sTestTwo = " + ReflectTest.getTestTwo());
    } catch (NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
}

输出结果:

2021-05-21 15:59:31.527 26806-26806/com.example.demo D/Charlie: sTestTwo = Modified

而如果将字段定义改为:

private static final String sTestTwo = "Origin";

则更改不成功

2021-05-21 16:05:11.679 27169-27169/com.example.demo D/Charlie: sTestTwo = Origin
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值