登录
  • 欢迎访问 Sharezer Blog

Modifier 修饰符工具类

Android sharezer 2209次浏览 已收录 0个评论

本文由 简悦 SimpRead 转码, 原文地址 www.cnblogs.com

[TOC]

在查看反射相关的 Class、Field 、Constructor 等类时,看到他们都有这样一个方法:getModifiers():返回此类或接口以整数编码的 Java 语言修饰符。如需要知道返回的值所代表的意思,则需要用到 java.lang.reflect.Modifier 这个类,这个类提供了 static 方法和常量,可以对类和成员访问修饰符进行解码。既然是位于 java.lang.reflect 下,那说明一般是在动态加载过程中、使用 java 反射对某些类进行过滤时会用到,一般开发并不是很常用。但是对于写框架,个人还是觉得可以用到的。

Modifier 修饰符工具类

public class java.lang.reflect.Modifier extends Object

JDK 中的介绍:Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。修饰符集被表示为整数,用不同的位位置 (bit position) 表示不同的修饰符。表示修饰符的常量值取自于 The JavaTM Virtual Machine Specification, Second edition 的表 4.14.44.5 和 4.7

访问修饰符列表


  • public static final int PUBLIC  = 0x00000001;

  • public static final int PRIVATE  = 0x00000002;

  • public static final int PROTECTED  = 0x00000004;

  • public static final int STATIC  = 0x00000008;

  • public static final int FINAL  = 0x00000010;

  • public static final int SYNCHRONIZED  = 0x00000020;        同步

  • public static final int VOLATILE  = 0x00000040;        用 volatile 修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。

  • public static final int TRANSIENT  = 0x00000080;        用 transient 关键字标记的成员变量不参与序列化过程。

  • public static final int NATIVE  = 0x00000100;

  • public static final int INTERFACE  = 0x00000200;

  • public static final int ABSTRACT  = 0x00000400;

  • public static final int STRICT  = 0x00000800;        即 strictfp(strict float point 精确浮点),此关键字可应用于类、接口或方法。

解码方法

以上所有的修饰符都有对应的、方法声明为【public static boolean is***(int mod)】的解码方法,且方法的实现也都是类似的,比如:

public static boolean isPublic(int mod) {
  return (mod & PUBLIC) != 0;
}

新增的方法

1.7 及 1.8 中新增了几个 API,目的是对 CLASS、INTERFACE、CONSTRUCTOR、METHOD、FIELD、PARAMETER 等类型的对象可以使用的所有修饰符。

private static final int CLASS_MODIFIERS =
    Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
    Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.FINAL   |
    Modifier.STRICT;
public static int classModifiers() {
    return CLASS_MODIFIERS;
}

private static final int INTERFACE_MODIFIERS =
    Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
    Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.STRICT;
public static int interfaceModifiers() {
    return INTERFACE_MODIFIERS;
}

private static final int CONSTRUCTOR_MODIFIERS =
    Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE;
public static int constructorModifiers() {
    return CONSTRUCTOR_MODIFIERS;
}

private static final int METHOD_MODIFIERS =
    Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
    Modifier.ABSTRACT       | Modifier.STATIC       | Modifier.FINAL   |
    Modifier.SYNCHRONIZED   | Modifier.NATIVE       | Modifier.STRICT;
public static int methodModifiers() {
    return METHOD_MODIFIERS;
}

private static final int FIELD_MODIFIERS =
    Modifier.PUBLIC         | Modifier.PROTECTED    | Modifier.PRIVATE |
    Modifier.STATIC         | Modifier.FINAL        | Modifier.TRANSIENT |
    Modifier.VOLATILE;
public static int fieldModifiers() {
    return FIELD_MODIFIERS;
}

private static final int PARAMETER_MODIFIERS =
    Modifier.FINAL;
public static int parameterModifiers() {
    return PARAMETER_MODIFIERS;
}

toString 方法的实现

public static String toString(int mod) {
  StringBuilder sb = new StringBuilder();
  int len;

  if ((mod & PUBLIC) != 0)        sb.append("public ");
  if ((mod & PROTECTED) != 0)     sb.append("protected ");
  if ((mod & PRIVATE) != 0)       sb.append("private ");

  /* Canonical典范、规范 order */
  if ((mod & ABSTRACT) != 0)      sb.append("abstract ");
  if ((mod & STATIC) != 0)        sb.append("static ");
  if ((mod & FINAL) != 0)         sb.append("final ");
  if ((mod & TRANSIENT) != 0)     sb.append("transient ");
  if ((mod & VOLATILE) != 0)      sb.append("volatile ");
  if ((mod & SYNCHRONIZED) != 0)  sb.append("synchronized ");
  if ((mod & NATIVE) != 0)        sb.append("native ");
  if ((mod & STRICT) != 0)        sb.append("strictfp ");
  if ((mod & INTERFACE) != 0)     sb.append("interface ");

  /* trim trailing space */
  if ((len = sb.length()) > 0)  return sb.toString().substring(0, len-1);
  return "";
}

示例 1:解码 mod 演示

public class Test {
  private static final transient int temp = 1;

  public static void main(String[] args) throws Exception {
    testModifier(Test.class.getDeclaredField("temp").getModifiers());//154。private static final transient
    testModifier(Test.class.getMethod("main", String[].class).getModifiers());//9。public static
  }

  public static void testModifier(int mod) {
    System.out.println("----------------------【mod=" + mod + "】----------------------");
    System.out.println("【toString】" + Modifier.toString(mod));
    System.out.println("【isPublic】" + Modifier.isPublic(mod));
    System.out.println("【isPrivate】" + Modifier.isPrivate(mod));
    System.out.println("【isProtected】" + Modifier.isProtected(mod));
    System.out.println("【isStatic】" + Modifier.isStatic(mod));
    System.out.println("【isFinal】" + Modifier.isFinal(mod));
    System.out.println("【isSynchronized】" + Modifier.isSynchronized(mod));
    System.out.println("【isVolatile】" + Modifier.isVolatile(mod));
    System.out.println("【isTransient】" + Modifier.isTransient(mod));
    System.out.println("【isNative】" + Modifier.isNative(mod));
    System.out.println("【isInterface】" + Modifier.isInterface(mod));
    System.out.println("【isAbstract】" + Modifier.isAbstract(mod));
    System.out.println("【isStrict】" + Modifier.isStrict(mod));
  }
}

示例 2:不同类型元素可使用的修饰符

System.out.println(Modifier.toString(Modifier.classModifiers()));//public protected private abstract static final strictfp
System.out.println(Modifier.toString(Modifier.interfaceModifiers()));//public protected private abstract static strictfp
System.out.println(Modifier.toString(Modifier.constructorModifiers()));//public protected private
System.out.println(Modifier.toString(Modifier.methodModifiers()));//public protected private abstract static final synchronized native strictfp
System.out.println(Modifier.toString(Modifier.fieldModifiers()));//public protected private static final transient volatile
System.out.println(Modifier.toString(Modifier.parameterModifiers()));//final

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

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

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

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