在查看Java.lang.reflect 包的源码的时候,发现了Modifier。
先将一些类方法列举出来。
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) 这个方法来分析:
public static boolean isPublic(int mod) {
return (mod & PUBLIC) != 0;
}
PUBLIC的值为 public static final int PUBLIC = 0x00000001;
并且查看其他的方法的代码可以发现,大部分都是直接与int数值进行与操作的。
我们看看这个isPublic这个方法在哪里有用到,并且是如何对比值得。
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虚拟机根据修饰符返回的常量。