在查看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虚拟机根据修饰符返回的常量。