Java类的修饰符判断:java.lang.reflect.Modifier

在查看Java.lang.reflect 包的源码的时候,发现了Modifier。java

先将一些类方法列举出来。数组

static boolean isAbstract(int mod)
          若是整数参数包括 abstract 修饰符,则返回 true,不然返回 false。
static boolean isFinal(int mod)
          若是整数参数包括 final 修饰符,则返回 true,不然返回 false。
static boolean isInterface(int mod)
          若是整数参数包括 interface 修饰符,则返回 true,不然返回 false。
static boolean isNative(int mod)
          若是整数参数包括 native 修饰符,则返回 true,不然返回 false。
static boolean isPrivate(int mod)
          若是整数参数包括 private 修饰符,则返回 true,不然返回 false。
static boolean isProtected(int mod)
          若是整数参数包括 protected 修饰符,则返回 true,不然返回 false。
static boolean isPublic(int mod)
          若是整数参数包括 public 修饰符,则返回 true,不然返回 false。
static boolean isStatic(int mod)
          若是整数参数包括 static 修饰符,则返回 true,不然返回 false。
static boolean isStrict(int mod)
          若是整数参数包括 strictfp 修饰符,则返回 true,不然返回 false。
static boolean isSynchronized(int mod)
          若是整数参数包括 synchronized 修饰符,则返回 true,不然返回 false。
static boolean isTransient(int mod)
          若是整数参数包括 transient 修饰符,则返回 true,不然返回 false。
static boolean isVolatile(int mod)
          若是整数参数包括 volatile 修饰符,则返回 true,不然返回 false。

参考JDK API 1.6.0中文版。
编码

咱们选 public static boolean isPublic(int mod) 这个方法来分析:spa

    public static boolean isPublic(int mod) {code

        return (mod & PUBLIC) != 0;对象

    }接口

PUBLIC的值为  public static final int PUBLIC           = 0x00000001;ci

而且查看其余的方法的代码能够发现,大部分都是直接与int数值进行与操做的。
文档

咱们看看这个isPublic这个方法在哪里有用到,而且是如何对比值得。get

1,在sun.reflect.FieldInfo,防范isPublic

public boolean isPublic() {

        return (Modifier.isPublic(modifiers()));

 }


public int modifiers() {

        return modifiers;

    }

此方法是经过FieldInfo对象自己的modifiers来判断是不是Public的。

2,在sun.reflect.misc.MethodUtil.getInternalPublicMethods(Class, Map),

发现有 Modifier.isPublic(cls.getModifiers()),

而后发现:

public native int java.lang.Class.getModifiers();

即,Class类的modifier是有native 方法返回的。

查看JDK文档:

  • 返回此类或接口以整数编码的 Java 语言修饰符。修饰符由 Java 虚拟机的 publicprotectedprivatefinalstaticabstractinterface 对应的常量组成;它们应当使用 Modifier 类的方法来解码。

    若是底层类是数组类,则其 publicprivateprotected 修饰符与其组件类型的修饰符相同。若是此 Class 表示一个基本类型或 void,则其 public 修饰符始终为 trueprotectedprivate 修饰符始终为 false。若是此对象表示一个数组类、一个基本类型或 void,则其 final 修饰符始终为 true,其接口修饰符始终为 false。该规范没有给定其余修饰符的值。

    Java Virtual Machine Specification 中的表 4.1 对修饰符编码进行了详细说明。  

即,modifier是由Java虚拟机根据修饰符返回的常量。

相关文章
相关标签/搜索