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

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

来自为知笔记(Wiz)

时间: 2024-10-10 09:59:12

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

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

C#修饰符之类修饰符:public.internal. partial.abstract.sealed.static C#修饰符之成员修饰符:public.protected.private.internal.sealed.abstract.virtual.override.readonly.const Public:最开放,所有的本程序集以及其他的程序集里面的对象都能够访问 Protected:比较开放,自身成员以及子类成员可访问 Private:只有自身成员才能够访问 Internal:本程

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

一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传参的子类类型 面向对象总结: 面向对象是一种编程方式,此编程方式的实现是基于类和对象的使用 类:是一个模板,模板中包含了多个函数共使用,即类中可包含多个函数(类中的函数即叫做方法) 一般疑问: 1)什么样的代码才是面向对象? 简单来说,如果程序中的所有功能否是由 “类”和“对象”实现,那么就是面向对

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

一.属性(特性) 普通方法去执行的时候,后面需要加括号,特性方法执行的时候和静态字段一样不需要不需要加括号. 特性方法不和字段同名. 特性方法不能传参数. 在我们定义数据库字段类的时候,往往需要对其中的类属性做一些限制,一般用get和set方法来写,那在python中,我们该怎么做能够少写代码,又能优雅的实现想要的限制,减少错误的发生呢,这时候就需要我们的@property. 获取特性 class Foo: def __init__(self,name): self.name = name #

结构体、权限修饰符、类简介

一.结构体 结构体:自定义的数据类型 1 struct student 2 { 3 public: // 结构成员缺省都默认为public,所以可以不加public 4 5 //private: // 私有的 6 // 成员变量 7 int number; // 学号 8 char name[100]; // 学生名 9 10 void func() // 成员函数 11 { 12 number++; 13 return; 14 } 15 16 } 17 18 // 若值需要通过函数传出去,需要

c++第一讲,结构,权限修饰符,类,以及类的代码组织。

c++中的结构和c中的结构有什么区别? c++中结构除具备了c中结构的所有功能外,还增加了很多拓展功能,其中最突出的拓展功能之一就是:c++中的结构不仅有成员变量,还可以定义成员函数(或者说方法) 权限修饰符:public private protect public:公共的意思,用这个修饰结构/类中的成员变量/成员函数,就可以被外界访问.一般我们需要能够被外界访问的东西,就定义为public就好像是该类的外部结构一样,也就是在类的作用域外也还可以使用. private:私有的意思,用这个修饰符

10_面向对象(类,抽象类,接口的综合练习、形参和返回值、包的概述和讲解、修饰符、内部类)

1:形式参数和返回值的问题(理解)    (1)形式参数:        类名:需要该类的对象        抽象类名:需要该类的子类对象        接口名:需要该接口的实现类对象    (2)返回值类型:        类名:返回的是该类的对象        抽象类名:返回的是该类的子类对象        接口名:返回的是该接口的实现类的对象    (3)链式编程        对象.方法1().方法2().......方法n();                这种用法:其实在方法1()

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

62 面向对象 类及其组成所使用的常见修饰符

修饰符 权限修饰符 private 默认的 protected public 状态修饰符 static final 抽象修饰符 abstract 类 权限修饰符 默认修饰符 public 状态修饰符 final 抽象修饰符 abstract 用得最多就是 public 成员变量 权限修饰符 private 默认的 protected public 状态修改符 static final 用得最多的是 private 构造方法 权限修饰符 private 默认的 protected public 用

06-JAVA类及成员的修饰符

类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final,将一个类生命为最终(即非继承类),表示他不能被其他类继承. friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类. 成员变量修饰符: public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问. private(私有访问控制符)指定该变量只允许自己的类的方法