修饰符

通过反射可以获取类的修饰符,主要方法: Class.getModifiers() 返回一个用于描述FieldMethodConstructor的修饰符的整形数值,该数值代表的含义可通过Modifier这个类分析。
Modifier 类它提供了有关Field、Method和Constructor等的访问修饰符的信息,主要的方法有:toString(int modifiers);
返回: 整形数值modifiers代表的修饰符的字符串;

查看类修饰符

使用 String.class 来验证一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.lang.reflect.Modifier;

/**
* 获取类的修改符
*
* @author liu kai
* @since 2015-11-23 14:48
*/
public class ModifierTest {

public static void main(String[] args) {
Class cl = String.class;
String modifiers = Modifier.toString(cl.getModifiers());
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
}
}

结果:

public final

来看一下 String 类的头部:

String的类修饰符

判断是否为 public

方法:

Reflection.quickCheckMemberAccess(clazz, modifiers);

举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void test() {
Class clz = String.class;
try {
Method method = clz.getMethod("isEmpty");
boolean isPublic = Reflection.quickCheckMemberAccess(clz, method.getModifiers());
if (isPublic) {
System.out.println("is public");
} else {
System.out.println("is private");
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}

查看源码

Reflection.quickCheckMemberAccess 的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14

/**
* The {@code int} value representing the {@code public}
* modifier.
*/
public static final int PUBLIC = 0x00000001;

public static boolean quickCheckMemberAccess(Class<?> var0, int var1) {
return Modifier.isPublic(getClassAccessFlags(var0) & var1);
}

public static boolean isPublic(int mod) {
return (mod & PUBLIC) != 0;
}

总结

这种用法在框架底层,如Spring 中有大量的用法。平时开发中虽然用到的少,但是学习一下有助于理解反射相关的机制和操作。