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

原创
2014/02/17 22:59
阅读数 493

在查看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 虚拟机的 publicprotectedprivatefinalstaticabstractinterface 对应的常量组成;它们应当使用 Modifier 类的方法来解码。

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

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

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


展开阅读全文
加载中

作者的其它热门文章

打赏
0
3 收藏
分享
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部
返回顶部
顶部