Java基礎——Modifier類


轉自: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.14.44.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)】的解碼方法,且方法的實現也都是類似的,比如:


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

 

新增的方法

1.7及1.8中新增了幾個API,目的是對CLASS、INTERFACE、CONSTRUCTOR、METHOD、FIELD、PARAMETER等類型的對象可以使用的所有修飾符。


   
   
  
  
          
  1. private static final int CLASS_MODIFIERS =
  2. Modifier. PUBLIC | Modifier. PROTECTED | Modifier. PRIVATE |
  3. Modifier. ABSTRACT | Modifier. STATIC | Modifier. FINAL |
  4. Modifier.STRICT;
  5. public static int classModifiers() {
  6. return CLASS_MODIFIERS;
  7. }
  8. private static final int INTERFACE_MODIFIERS =
  9. Modifier. PUBLIC | Modifier. PROTECTED | Modifier. PRIVATE |
  10. Modifier. ABSTRACT | Modifier. STATIC | Modifier.STRICT;
  11. public static int interfaceModifiers() {
  12. return INTERFACE_MODIFIERS;
  13. }
  14. private static final int CONSTRUCTOR_MODIFIERS =
  15. Modifier. PUBLIC | Modifier. PROTECTED | Modifier. PRIVATE;
  16. public static int constructorModifiers() {
  17. return CONSTRUCTOR_MODIFIERS;
  18. }
  19. private static final int METHOD_MODIFIERS =
  20. Modifier. PUBLIC | Modifier. PROTECTED | Modifier. PRIVATE |
  21. Modifier. ABSTRACT | Modifier. STATIC | Modifier. FINAL |
  22. Modifier.SYNCHRONIZED | Modifier.NATIVE | Modifier.STRICT;
  23. public static int methodModifiers() {
  24. return METHOD_MODIFIERS;
  25. }
  26. private static final int FIELD_MODIFIERS =
  27. Modifier. PUBLIC | Modifier. PROTECTED | Modifier. PRIVATE |
  28. Modifier. STATIC | Modifier. FINAL | Modifier.TRANSIENT |
  29. Modifier.VOLATILE;
  30. public static int fieldModifiers() {
  31. return FIELD_MODIFIERS;
  32. }
  33. private static final int PARAMETER_MODIFIERS =
  34. Modifier. FINAL;
  35. public static int parameterModifiers() {
  36. return PARAMETER_MODIFIERS;
  37. }

 

toString 方法的實現


   
   
  
  
          
  1. public static String toString( int mod) {
  2. StringBuilder sb = new StringBuilder();
  3. int len;
  4. if ((mod & PUBLIC) != 0) sb. append( "public ");
  5. if ((mod & PROTECTED) != 0) sb. append( "protected ");
  6. if ((mod & PRIVATE) != 0) sb. append( "private ");
  7. /* Canonical典范、規范 order */
  8. if ((mod & ABSTRACT) != 0) sb. append( "abstract ");
  9. if ((mod & STATIC) != 0) sb. append( "static ");
  10. if ((mod & FINAL) != 0) sb. append( "final ");
  11. if ((mod & TRANSIENT) != 0) sb. append( "transient ");
  12. if ((mod & VOLATILE) != 0) sb. append( "volatile ");
  13. if ((mod & SYNCHRONIZED) != 0) sb. append( "synchronized ");
  14. if ((mod & NATIVE) != 0) sb. append( "native ");
  15. if ((mod & STRICT) != 0) sb. append( "strictfp ");
  16. if ((mod & INTERFACE) != 0) sb. append( "interface ");
  17. /* trim trailing space */
  18. if (( len = sb.length()) > 0) return sb.toString().substring( 0, len -1);
  19. return "";
  20. }

 

示例1:解碼mod演示


   
   
  
  
          
  1. public class Test {
  2. private static final transient int temp = 1;
  3. public static void main( String[] args) throws Exception {
  4. testModifier( Test. class.getDeclaredField( "temp").getModifiers()); //154。private static final transient
  5. testModifier( Test. class.getMethod( "main", String[]. class).getModifiers()); //9。public static
  6. }
  7. public static void testModifier(int mod) {
  8. System.out. println( "----------------------【mod=" + mod + "】----------------------");
  9. System.out. println( "【toString】" + Modifier. toString(mod));
  10. System.out. println( "【isPublic】" + Modifier.isPublic(mod));
  11. System.out. println( "【isPrivate】" + Modifier.isPrivate(mod));
  12. System.out. println( "【isProtected】" + Modifier.isProtected(mod));
  13. System.out. println( "【isStatic】" + Modifier.isStatic(mod));
  14. System.out. println( "【isFinal】" + Modifier.isFinal(mod));
  15. System.out. println( "【isSynchronized】" + Modifier.isSynchronized(mod));
  16. System.out. println( "【isVolatile】" + Modifier.isVolatile(mod));
  17. System.out. println( "【isTransient】" + Modifier.isTransient(mod));
  18. System.out. println( "【isNative】" + Modifier.isNative(mod));
  19. System.out. println( "【isInterface】" + Modifier.isInterface(mod));
  20. System.out. println( "【isAbstract】" + Modifier.isAbstract(mod));
  21. System.out. println( "【isStrict】" + Modifier.isStrict(mod));
  22. }
  23. }

 

示例2:不同類型元素可使用的修飾符


   
   
  
  
          
  1. System.out. println( Modifier. toString( Modifier.classModifiers())); //public protected private abstract static final strictfp
  2. System.out. println( Modifier. toString( Modifier.interfaceModifiers())); //public protected private abstract static strictfp
  3. System.out. println( Modifier. toString( Modifier.constructorModifiers())); //public protected private
  4. System.out. println( Modifier. toString( Modifier.methodModifiers())); //public protected private abstract static final synchronized native strictfp
  5. System.out. println( Modifier. toString( Modifier.fieldModifiers())); //public protected private static final transient volatile
  6. System.out. println( Modifier. toString( Modifier.parameterModifiers())); //final


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM