登录
  • 欢迎访问 Sharezer Blog

反射修改修饰符

Android sharezer 2332次浏览 已收录 0个评论
// 移除所有方法的final字段
public static void removeFinal(Class<?> clazz, Method[] methods) {
  Class classClass = Method.class;
  for (Method method : methods) {
    try {
      Field accessFlagsField = classClass.getSuperclass().getDeclaredField("accessFlags");
      accessFlagsField.setAccessible(true);
      Integer accessFlags = (Integer) accessFlagsField.get(method);
      if (Modifier.isFinal(accessFlags)) {
        accessFlags &= ~Modifier.FINAL;
        accessFlagsField.setInt(method, accessFlags);
        Log.e("removeFinal", clazz.getName() + ":" + method.getName() + " result " + Modifier.isFinal((Integer) accessFlagsField.get(method)));
      }
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
  }
}

// 给所有构造方法添加public描述
public static void addPublic(Class<?> clazz, Constructor[] constructors) {
  Class classClass = Constructor.class;
  for (Constructor constructor : constructors) {
    try {
      Field accessFlagsField = classClass.getSuperclass().getDeclaredField("accessFlags");
      accessFlagsField.setAccessible(true);
      Integer accessFlags = (Integer) accessFlagsField.get(constructor);
      if (!Modifier.isPublic(accessFlags)) {
        accessFlags |= Modifier.PUBLIC;
        accessFlagsField.setInt(constructor, accessFlags);
        Log.e("addPublic", clazz.getName() + ":" + constructor.getName() + " result " + Modifier.isPublic((Integer) accessFlagsField.get(constructor)));
      }
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
  }
}

Sharezer , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明反射修改修饰符
喜欢 (27)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址