在查看反射相关的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
2017-9-5

反射 Reflect Modifier 修饰符工具类的更多相关文章

  1. Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇

    一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传 ...

  2. 10-04 Java 权限修饰符,类及其组成常见的修饰符

    四种权限修饰符的测试 /* 权限修饰符: 本类 同一个包下(子类和无关类) 不同包下(子类) 不同包下(无关类) private Y 默认 Y Y protected Y Y Y public Y Y ...

  3. Python学习:17.Python面向对象(四、属性(特性),成员修饰符,类的特殊成员)

    一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中 ...

  4. 学习C#修饰符:类修饰符和成员修饰符

    C#修饰符之类修饰符:public.internal. partial.abstract.sealed.static C#修饰符之成员修饰符:public.protected.private.inte ...

  5. python基础(27):类成员的修饰符、类的特殊成员

    1. 类成员的修饰符 类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的定义不同:私 ...

  6. 类的高级:访问修饰符、封装、静态类成员static、内部类;

    访问修饰符: 公开访问(public):对所有子类,非子类访问: 受保护的(protected):只有同包子类.非子类.不同包子类可访问,不同包非子类不可访问: 私有的(private):只有本类可访 ...

  7. Java类访问权限修饰符

    一.概要 通过了解Java4种修饰符访问权限,能够进一步完善程序类,合理规划权限的范围,这样才能减少漏洞.提高安全性.具备表达力便于使用. 二.权限表 修饰符 同一个类 同一个包 不同包的子类 不同包 ...

  8. Java中各种(类、方法、属性)访问修饰符与修饰符的说明

    类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所 ...

  9. 访问修饰符(access modifier)。

    1)public(公共的):被 public所修饰的属性和方法可以被有类访问. 所修饰的属性和方法可以被有类访问. 2)protected (受保护的):被protected所修饰的属性和方法可以在类 ...

随机推荐

  1. 集群运维ansible

    ssh免密登录 集群运维 生成秘钥,一路enter cd ~/.ssh/ ssh-keygen -t rsa 讲id_rsa.pub文件追加到授权的key文件中 cat ~/.ssh/id_rsa.p ...

  2. 字符串hash与字典树

    title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是 ...

  3. eNSP仿真学习和VLAN配置

    路由&交换机基本命令 sys #切换到系统视图(修改配置),Ctrl+Z 返回用户视图 sysname SW1 #设备重命名为SW1 int g0/0/1 #进入接口视图 VLAN配置 首先连 ...

  4. android studio 汉化包 美化包

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 汉化包 百度云盘 下载地址:https://pan.baidu.com/s/1pLjwy ...

  5. [LeetCode] Pacific Atlantic Water Flow 题解

    题意 题目 思路 一开始想用双向广搜来做,找他们相碰的点,但是发现对其的理解还是不够完全,导致没写成功.不过,后来想清楚了,之前的错误可能在于从边界点进行BFS,其访问顺序应该是找到下一个比当前那个要 ...

  6. 【对比分析三】CSS中 link 和@import 的区别

    1).  link 是 XHTML 标签,无兼容问题: @import 是在 CSS2.1 提出的,只有IE5以上才能识别. 2).  语法结构不同. link (链接式)只能放入HTML源码中,语法 ...

  7. Comparable<T> 和 Comparator<T>

    相同点: Comparable<T> 和 Comparator<T>都是接口 不同点: 两者声明的方法不同.前者是compareTo()方法,后者是compare()方法. C ...

  8. 【机器学习算法-python实现】决策树-Decision tree(2) 决策树的实现

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景      接着上一节说,没看到请先看一下上一节关于数据集的划分数据集划分.如今我们得到了每一个特征值得 ...

  9. ISO 7816-4: Interindustry Commands for Interchange

    5. Basic Organizations 5.1 Data structures5.2 Security architecture of the card 5.3 APDU message str ...

  10. Install WordPress Plugins without FTP Access

    WordPress will only prompt you for your FTP connection information while trying to install plugins o ...