package java.lang.reflect;
import java.security.AccessController;
import sun.reflect.LangReflectAccess;
import sun.reflect.ReflectionFactory;
/**
*
* 用来判断元素类型,元素类型是一个int型的数,它的不同位(bit)表示不同的描述符
*
* comment by liqiang
*
* @author Nakul Saraiya
* @author Kenneth Russell
*/
public
class Modifier {
/*
* Bootstrapping protocol between java.lang and java.lang.reflect
* packages
*/
static {
sun.reflect.ReflectionFactory factory =
(sun.reflect.ReflectionFactory) AccessController.doPrivileged(
new ReflectionFactory.GetReflectionFactoryAction()
);
factory.setLangReflectAccess(new java.lang.reflect.ReflectAccess());
}
//是否含有public描述符
public static boolean isPublic(int mod) {
//判断public位是否为1,除了public位上为一其他位都为0
//做按位与操作,如果public位为1则结果为1,否则为0
return (mod & PUBLIC) != 0;
}
//是否含有private描述符
public static boolean isPrivate(int mod) {
return (mod & PRIVATE) != 0;
}
//是否含有protected描述符
public static boolean isProtected(int mod) {
return (mod & PROTECTED) != 0;
}
//是否含有static描述符
public static boolean isStatic(int mod) {
return (mod & STATIC) != 0;
}
//是否含有final描述符
public static boolean isFinal(int mod) {
return (mod & FINAL) != 0;
}
//是否含有synchronized描述符
public static boolean isSynchronized(int mod) {
return (mod & SYNCHRONIZED) != 0;
}
//是否含有volatile描述符
public static boolean isVolatile(int mod) {
return (mod & VOLATILE) != 0;
}
//是否含有transient描述符
public static boolean isTransient(int mod) {
return (mod & TRANSIENT) != 0;
}
//是否含有native描述符
public static boolean isNative(int mod) {
return (mod & NATIVE) != 0;
}
//是否含有interface描述符
public static boolean isInterface(int mod) {
return (mod & INTERFACE) != 0;
}
//是否含有abstract描述符
public static boolean isAbstract(int mod) {
return (mod & ABSTRACT) != 0;
}
//是否含有strict描述符
public static boolean isStrict(int mod) {
return (mod & STRICT) != 0;
}
//返回此描述项的字符串表示
public static String toString(int mod) {
StringBuffer sb = new StringBuffer();
int len;
//向StringBuffer中添加含有的不同描述符
if ((mod & PUBLIC) != 0) sb.append("public ");
if ((mod & PROTECTED) != 0) sb.append("protected ");
if ((mod & PRIVATE) != 0) sb.append("private ");
/* Canonical order */
if ((mod & ABSTRACT) != 0) sb.append("abstract ");
if ((mod & STATIC) != 0) sb.append("static ");
if ((mod & FINAL) != 0) sb.append("final ");
if ((mod & TRANSIENT) != 0) sb.append("transient ");
if ((mod & VOLATILE) != 0) sb.append("volatile ");
if ((mod & SYNCHRONIZED) != 0) sb.append("synchronized ");
if ((mod & NATIVE) != 0) sb.append("native ");
if ((mod & STRICT) != 0) sb.append("strictfp ");
if ((mod & INTERFACE) != 0) sb.append("interface ");
//如果有定义描述符则去掉最后一个空格
if ((len = sb.length()) > 0)
return sb.toString().substring(0, len-1);
//没有定义返回空字符串
return "";
}
//每一特定位表示一种描述类型,1为有0为没有,有多个1表示同时具有多个描述符
//它只使用了12位,用short就可以表示,可能是为了扩展考虑
//int型的值的第1位表示public
public static final int PUBLIC = 0x00000001;
//第2位表示private
public static final int PRIVATE = 0x00000002;
//第3位表示protected
public static final int PROTECTED = 0x00000004;
//第4位表示static
public static final int STATIC = 0x00000008;
//第5位表示final
public static final int FINAL = 0x00000010;
//第6位表示synchronized(标志同步方法,同步块)
public static final int SYNCHRONIZED = 0x00000020;
//第7位表示volatile(表示同步安全)
public static final int VOLATILE = 0x00000040;
//第8位表示transient(表示持久化时不处理的字段)
public static final int TRANSIENT = 0x00000080;
//第9位表示nateive(本地方法)
public static final int NATIVE = 0x00000100;
//第10位表示interface
public static final int INTERFACE = 0x00000200;
//第11表示abstract
public static final int ABSTRACT = 0x00000400;
//第12位表示strict
public static final int STRICT = 0x00000800;
}