转自:https://www.cnblogs.com/baiqiantao/p/7478523.html   反射 Reflect Modifier 修饰符工具类

在查看反射相关的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)】的解码方法,且方法的实现也都是类似的,比如:


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

新增的方法

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


  1. private static final int CLASS_MODIFIERS =
  2. Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
  3. Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL |
  4. Modifier.STRICT;
  5. public static int classModifiers() {
  6. return CLASS_MODIFIERS;
  7. }
  8. private static final int INTERFACE_MODIFIERS =
  9. Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
  10. Modifier.ABSTRACT | Modifier.STATIC | Modifier.STRICT;
  11. public static int interfaceModifiers() {
  12. return INTERFACE_MODIFIERS;
  13. }
  14. private static final int CONSTRUCTOR_MODIFIERS =
  15. Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE;
  16. public static int constructorModifiers() {
  17. return CONSTRUCTOR_MODIFIERS;
  18. }
  19. private static final int METHOD_MODIFIERS =
  20. Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
  21. Modifier.ABSTRACT | Modifier.STATIC | Modifier.FINAL |
  22. Modifier.SYNCHRONIZED | Modifier.NATIVE | Modifier.STRICT;
  23. public static int methodModifiers() {
  24. return METHOD_MODIFIERS;
  25. }
  26. private static final int FIELD_MODIFIERS =
  27. Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE |
  28. Modifier.STATIC | Modifier.FINAL | Modifier.TRANSIENT |
  29. Modifier.VOLATILE;
  30. public static int fieldModifiers() {
  31. return FIELD_MODIFIERS;
  32. }
  33. private static final int PARAMETER_MODIFIERS =
  34. Modifier.FINAL;
  35. public static int parameterModifiers() {
  36. return PARAMETER_MODIFIERS;
  37. }

toString 方法的实现


  1. public static String toString(int mod) {
  2. StringBuilder sb = new StringBuilder();
  3. int len;
  4. if ((mod & PUBLIC) != 0) sb.append("public ");
  5. if ((mod & PROTECTED) != 0) sb.append("protected ");
  6. if ((mod & PRIVATE) != 0) sb.append("private ");
  7. /* Canonical典范、规范 order */
  8. if ((mod & ABSTRACT) != 0) sb.append("abstract ");
  9. if ((mod & STATIC) != 0) sb.append("static ");
  10. if ((mod & FINAL) != 0) sb.append("final ");
  11. if ((mod & TRANSIENT) != 0) sb.append("transient ");
  12. if ((mod & VOLATILE) != 0) sb.append("volatile ");
  13. if ((mod & SYNCHRONIZED) != 0) sb.append("synchronized ");
  14. if ((mod & NATIVE) != 0) sb.append("native ");
  15. if ((mod & STRICT) != 0) sb.append("strictfp ");
  16. if ((mod & INTERFACE) != 0) sb.append("interface ");
  17. /* trim trailing space */
  18. if ((len = sb.length()) > 0) return sb.toString().substring(0, len-1);
  19. return "";
  20. }

示例1:解码mod演示


  1. public class Test {
  2. private static final transient int temp = 1;
  3. public static void main(String[] args) throws Exception {
  4. testModifier(Test.class.getDeclaredField("temp").getModifiers());//154。private static final transient
  5. testModifier(Test.class.getMethod("main", String[].class).getModifiers());//9。public static
  6. }
  7. public static void testModifier(int mod) {
  8. System.out.println("----------------------【mod=" + mod + "】----------------------");
  9. System.out.println("【toString】" + Modifier.toString(mod));
  10. System.out.println("【isPublic】" + Modifier.isPublic(mod));
  11. System.out.println("【isPrivate】" + Modifier.isPrivate(mod));
  12. System.out.println("【isProtected】" + Modifier.isProtected(mod));
  13. System.out.println("【isStatic】" + Modifier.isStatic(mod));
  14. System.out.println("【isFinal】" + Modifier.isFinal(mod));
  15. System.out.println("【isSynchronized】" + Modifier.isSynchronized(mod));
  16. System.out.println("【isVolatile】" + Modifier.isVolatile(mod));
  17. System.out.println("【isTransient】" + Modifier.isTransient(mod));
  18. System.out.println("【isNative】" + Modifier.isNative(mod));
  19. System.out.println("【isInterface】" + Modifier.isInterface(mod));
  20. System.out.println("【isAbstract】" + Modifier.isAbstract(mod));
  21. System.out.println("【isStrict】" + Modifier.isStrict(mod));
  22. }
  23. }

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


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

Java基础——Modifier类的更多相关文章

  1. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  2. java基础-BigDecimal类常用方法介绍

    java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制 ...

  3. java基础-BigInteger类常用方法介绍

    java基础-BigInteger类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigInteger类概述 Java中long型为最大整数类型,对于超过long ...

  4. java基础-Arrays类常用方法介绍

    java基础-Arrays类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Array类的概念 此类包含用来操作数组(比如排序和搜索)的各种方法.需要注意,如果指定 ...

  5. java基础-Math类常用方法介绍

    java基础-Math类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Math类概念 Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函 ...

  6. java基础-System类常用方法介绍

    java基础-System类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.System类概念 在API中system类介绍的比较简单,我们给出定义,system中 ...

  7. java基础-Integer类常用方法介绍

    java基础-Integer类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需 ...

  8. Java基础-Calendar类常用方法介绍

    Java基础-Calendar类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Calendar类概念 Calendar 类是一个抽象类,它为特定瞬间与一组诸如 Y ...

  9. Java基础-Date类常用方法介绍

    Java基础-Date类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.毫秒值概念 我们在查阅Date类的API文档时,会发现这样的一句话:"The cl ...

随机推荐

  1. python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器

    一.元组: tuple Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组 tup2 = (111, 22, 33, ...

  2. Linux下运行scala语言的jar包

    1.新建project 2.打包 3.linux下运行jar包 #First.jar为jar包名,Test为主类名 [root@FI-2 Desktop]# spark-submit First.ja ...

  3. (转)php中字符过滤

    有时候为了安全起见,我们需要对用户输入的字符串进行转义       文章中有不正确的或者说辞不清的地方,麻烦大家指出了--- 与PHP字符串转义相关的配置和函数如下: 1.magic_quotes_r ...

  4. Apache配置转发

    第一种: LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_htt ...

  5. 2019秋Java学期课程总结

    眨眼间,Java这门课程就快要到了尾声,这门课程主要学习到 搭建了Java的编译环境,安装eclipse软件,会用Java写一些简单的程序. 主要学习到的知识点有以下几点 1:通过写pta上的作业知道 ...

  6. 第七周课程总结 & 实验报告(五)

    第七周课程总结 一.抽象类与接口的应用 1.实例化 2.实际应用 ---模板设计(抽象类) ---制定标准(接口) 3.设计模式 ---工厂设计 ---代理设计 ---适配器设计 二.抽象类与接口之间 ...

  7. js中filter过滤用法总结

    定义和用法 filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素. 注意: filter() 不会对空数组进行检测. 注意: filter() 不会改变原始数组 ...

  8. 排序算法(C++)

    冒泡排序.选择排序.快速排序.插入排序.希尔排序.归并排序.基数排序.堆排序. 推荐网址1:https://www.cnblogs.com/onepixel/articles/7674659.html ...

  9. LeetCode 236. 二叉树的最近公共祖先(Lowest Common Ancestor of a Binary Tree)

    题目描述 给定一棵二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义: “对于有根树T的两个结点u.v,最近公共祖先表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. ...

  10. 在控制台程序中,添加config文件

    一.右击类库 → 添加 → 新建项 → 应用程序配置文件(或者选择一个XML文件,然后将名字改成XXX.config),内容如下: <?xml version="1.0" e ...