在查看反射相关的Class、Field 、Constructor 等类时,看到他们都有这样一个方法:getModifiers():返回此类或接口以整数编码的 Java 语言修饰符。如需要知道返回的值所代表的意思,则需要用到 java.lang.reflect.Modifier 这个类,这个类提供了 static 方法和常量,可以对类和成员访问修饰符进行解码。
既然是位于 java.lang.reflect 下,那说明一般是在动态加载过程中、使用java反射对某些类进行过滤时会用到,一般开发并不是很常用。但是对于写框架,个人还是觉得可以用到的。
Modifier 修饰符工具类
public class java.lang.reflect.Modifier extends Object
解码方法
以上所有的修饰符都有对应的、方法声明为【public static boolean is***(int mod)】的解码方法,且方法的实现也都是类似的,比如:
public static boolean isPublic(int mod) {
return (mod & PUBLIC) != 0;
}
toString 方法的实现
public static String toString(int mod) {
StringBuilder sb = new StringBuilder();
int len;
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 ");
/* trim trailing space */
if ((len = sb.length()) > 0) return sb.toString().substring(0, len-1);
return "";
}
示例1:解码mod演示
public class Test {
private static final transient int temp = 1;
public static void main(String[] args) throws Exception {
testModifier(Test.class.getDeclaredField("temp").getModifiers());//154。private static final transient
testModifier(Test.class.getMethod("main", String[].class).getModifiers());//9。public static
}
public static void testModifier(int mod) {
System.out.println("----------------------【mod=" + mod + "】----------------------");
System.out.println("【toString】" + Modifier.toString(mod));
System.out.println("【isPublic】" + Modifier.isPublic(mod));
System.out.println("【isPrivate】" + Modifier.isPrivate(mod));
System.out.println("【isProtected】" + Modifier.isProtected(mod));
System.out.println("【isStatic】" + Modifier.isStatic(mod));
System.out.println("【isFinal】" + Modifier.isFinal(mod));
System.out.println("【isSynchronized】" + Modifier.isSynchronized(mod));
System.out.println("【isVolatile】" + Modifier.isVolatile(mod));
System.out.println("【isTransient】" + Modifier.isTransient(mod));
System.out.println("【isNative】" + Modifier.isNative(mod));
System.out.println("【isInterface】" + Modifier.isInterface(mod));
System.out.println("【isAbstract】" + Modifier.isAbstract(mod));
System.out.println("【isStrict】" + Modifier.isStrict(mod));
}
}
示例2:不同类型元素可使用的修饰符
System.out.println(Modifier.toString(Modifier.classModifiers()));//public protected private abstract static final strictfp
System.out.println(Modifier.toString(Modifier.interfaceModifiers()));//public protected private abstract static strictfp
System.out.println(Modifier.toString(Modifier.constructorModifiers()));//public protected private
System.out.println(Modifier.toString(Modifier.methodModifiers()));//public protected private abstract static final synchronized native strictfp
System.out.println(Modifier.toString(Modifier.fieldModifiers()));//public protected private static final transient volatile
System.out.println(Modifier.toString(Modifier.parameterModifiers()));//final