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虛擬機根據修飾符返回的常量。

相關文章
相關標籤/搜索