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

在查看Java.lang.reflect 包的源码的时候,发现了Modifier。

先将一些类方法列举出来。

static booleanisAbstract(int mod)
          如果整数参数包括 abstract 修饰符,则返回 true,否则返回 false。
static booleanisFinal(int mod)
          如果整数参数包括 final 修饰符,则返回 true,否则返回 false。
static booleanisInterface(int mod)
          如果整数参数包括 interface 修饰符,则返回 true,否则返回 false。
static booleanisNative(int mod)
          如果整数参数包括 native 修饰符,则返回 true,否则返回 false。
static booleanisPrivate(int mod)
          如果整数参数包括 private 修饰符,则返回 true,否则返回 false。
static booleanisProtected(int mod)
          如果整数参数包括 protected 修饰符,则返回 true,否则返回 false。
static booleanisPublic(int mod)
          如果整数参数包括 public 修饰符,则返回 true,否则返回 false。
static booleanisStatic(int mod)
          如果整数参数包括 static 修饰符,则返回 true,否则返回 false。
static booleanisStrict(int mod)
          如果整数参数包括 strictfp 修饰符,则返回 true,否则返回 false。
static booleanisSynchronized(int mod)
          如果整数参数包括 synchronized 修饰符,则返回 true,否则返回 false。
static booleanisTransient(int mod)
          如果整数参数包括 transient 修饰符,则返回 true,否则返回 false。
static booleanisVolatile(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虚拟机根据修饰符返回的常量。


转载于:https://my.oschina.net/u/214483/blog/200568

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值