轉自:https://www.cnblogs.com/baiqiantao/p/7478523.html 反射 Reflect Modifier 修飾符工具類
在查看反射相關的Class、Field 、Constructor 等類時,看到他們都有這樣一個方法:getModifiers():返回此類或接口以整數編碼的 Java 語言修飾符。如需要知道返回的值所代表的意思,則需要用到 java.lang.reflect.Modifier 這個類,這個類提供了 static 方法和常量,可以對類和成員訪問修飾符進行解碼。
既然是位於 java.lang.reflect 下,那說明一般是在動態加載過程中、使用java反射對某些類進行過濾時會用到,一般開發並不是很常用。但是對於寫框架,個人還是覺得可以用到的。
Modifier 修飾符工具類
public class java.lang.reflect.Modifier extends Object
JDK中的介紹:
Modifier 類提供了 static 方法和常量,對類和成員訪問修飾符進行解碼。修飾符集被表示為整數,用不同的位位置 (bit position) 表示不同的修飾符。表示修飾符的常量值取自於 The JavaTM Virtual Machine Specification, Second edition 的表 4.1、4.4、4.5 和 4.7。
訪問修飾符列表
- public static final int PUBLIC = 0x00000001;
- public static final int PRIVATE = 0x00000002;
- public static final int PROTECTED = 0x00000004;
- public static final int STATIC = 0x00000008;
- public static final int FINAL = 0x00000010;
- public static final int SYNCHRONIZED = 0x00000020; 同步
- public static final int VOLATILE = 0x00000040; 用volatile修飾的變量,線程在每次使用變量的時候,都會讀取變量修改后的最的值。
- public static final int TRANSIENT = 0x00000080; 用transient關鍵字標記的成員變量不參與序列化過程。
- public static final int NATIVE = 0x00000100;
- public static final int INTERFACE = 0x00000200;
- public static final int ABSTRACT = 0x00000400;
- public static final int STRICT = 0x00000800; 即strictfp(strict float point 精確浮點),此關鍵字可應用於類、接口或方法。
解碼方法
以上所有的修飾符都有對應的、方法聲明為【public static boolean is***(int mod)】的解碼方法,且方法的實現也都是類似的,比如:
-
public static boolean isPublic(int mod) {
-
return (mod & PUBLIC) !=
0;
-
}
新增的方法
1.7及1.8中新增了幾個API,目的是對CLASS、INTERFACE、CONSTRUCTOR、METHOD、FIELD、PARAMETER等類型的對象可以使用的所有修飾符。
-
private
static
final int CLASS_MODIFIERS =
-
Modifier.
PUBLIC | Modifier.
PROTECTED | Modifier.
PRIVATE |
-
Modifier.
ABSTRACT | Modifier.
STATIC | Modifier.
FINAL |
-
Modifier.STRICT;
-
public
static int classModifiers() {
-
return CLASS_MODIFIERS;
-
}
-
-
private
static
final int INTERFACE_MODIFIERS =
-
Modifier.
PUBLIC | Modifier.
PROTECTED | Modifier.
PRIVATE |
-
Modifier.
ABSTRACT | Modifier.
STATIC | Modifier.STRICT;
-
public
static int interfaceModifiers() {
-
return INTERFACE_MODIFIERS;
-
}
-
-
private
static
final int CONSTRUCTOR_MODIFIERS =
-
Modifier.
PUBLIC | Modifier.
PROTECTED | Modifier.
PRIVATE;
-
public
static int constructorModifiers() {
-
return CONSTRUCTOR_MODIFIERS;
-
}
-
-
private
static
final int METHOD_MODIFIERS =
-
Modifier.
PUBLIC | Modifier.
PROTECTED | Modifier.
PRIVATE |
-
Modifier.
ABSTRACT | Modifier.
STATIC | Modifier.
FINAL |
-
Modifier.SYNCHRONIZED | Modifier.NATIVE | Modifier.STRICT;
-
public
static int methodModifiers() {
-
return METHOD_MODIFIERS;
-
}
-
-
private
static
final int FIELD_MODIFIERS =
-
Modifier.
PUBLIC | Modifier.
PROTECTED | Modifier.
PRIVATE |
-
Modifier.
STATIC | Modifier.
FINAL | Modifier.TRANSIENT |
-
Modifier.VOLATILE;
-
public
static int fieldModifiers() {
-
return FIELD_MODIFIERS;
-
}
-
-
private
static
final int PARAMETER_MODIFIERS =
-
Modifier.
FINAL;
-
public
static int parameterModifiers() {
-
return PARAMETER_MODIFIERS;
-
}
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