在查看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 虛擬機的 public
、protected
、private
、final
、static
、abstract
和 interface
對應的常量組成;它們應當使用 Modifier
類的方法來解碼。
若是底層類是數組類,則其 public
、private
和 protected
修飾符與其組件類型的修飾符相同。若是此 Class
表示一個基本類型或 void,則其 public
修飾符始終爲 true
,protected
和 private
修飾符始終爲 false
。若是此對象表示一個數組類、一個基本類型或 void,則其 final
修飾符始終爲 true
,其接口修飾符始終爲 false
。該規範沒有給定其餘修飾符的值。
Java Virtual Machine Specification 中的表 4.1 對修飾符編碼進行了詳細說明。
即,modifier是由Java虛擬機根據修飾符返回的常量。