<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 56, comments - 54, trackbacks - 0, articles - 4
       ::  ::  :: 聯系 :: 聚合  :: 管理

    反射機制---Java的動態特性之一

    Posted on 2006-04-14 17:02 Terry的Blog 閱讀(1940) 評論(0)  編輯  收藏 所屬分類: java語言

    Reflection是Java的一個重要特性。這種機制可以讓我們通過類名,方法名,數據成員名來得到相關的元素。
    關鍵類java.lang.Class:這個也是Object的子類 是利用反射機制的起點。
    1:產生Class object
    使用getClass()
    String str = "abc";
    Class c1 = str.getClass();

    使用Class.getSuperclass();
    Button b = new Button();
    Class c1 = b.getClass();
    Class c2 = c1.getSuperclass();

    使用static method Class.forName()
    Class c1 = Class.forName ("java.lang.String");
    Class c2 = Class.forName ("java.awt.Button");
    Class c3 = Class.forName ("java.util.LinkedList$Entry");

    使用 類名.class
    Class c1 = String.class;
    Class c2 = java.awt.Button.class;
    Class c3 = Main.InnerClass.class;
    Class c4 = int.class;
    Class c5 = int[].class;

    使用primitive wrapper classes的TYPE
    Class c1 = Boolean.TYPE;
    Class c2 = Byte.TYPE;
    Class c3 = Character.TYPE;
    Class c4 = Short.TYPE;
    Class c5 = Integer.TYPE;
    Class c6 = Long.TYPE;
    Class c7 = Float.TYPE;
    Class c8 = Double.TYPE;
    Class c9 = Void.TYPE;

    2:使用 Class object

    package  reflection;

    import  java.lang.reflect.Constructor;
    import  java.lang.reflect.Field;
    import  java.lang.reflect.Method;
    import  java.lang.reflect.Modifier;
    import  java.util.HashMap;

    public   class  TestRef  {

        
    public   static   void  main(String[] args)  throws  Exception {
            TestRef testRef 
    =   new  TestRef();
            Class clazz 
    =  TestRef. class ;
            System.out.println(
    " getPackage() =  "   +  clazz.getPackage().getName());
           
    //  getModifiers()的返回值可以包含類的種類信息。比如是否為public,abstract,static
           int  mod  =  clazz.getModifiers();
            System.out.println(
    " Modifier.isAbstract(mod) =  " + Modifier.isAbstract(mod));
            System.out.println(
    " getName() =  " + clazz.getName());
            System.out.println(
    " getSuperclass() =  " + clazz.getSuperclass().getName());
            System.out.println(
    " getInterfaces() =  " + clazz.getInterfaces()); // 實現了哪些Interface
           System.out.println( " clazz.getDeclaredClasses() =  " + clazz.getDeclaredClasses()); // 包含哪些內部類
           System.out.println( " getDeclaringClass() =  " + clazz.getDeclaringClass()); // 如果clazz是inner class 那么返回其outer class
            
            System.out.println(
    " ---------- " );
            Constructor[] constructor 
    =  clazz.getDeclaredConstructors(); // 返回一組構造函數 Constructor[]
             if  (constructor  !=   null ) {
                
    for  ( int  i  =   0 ; i  <  constructor.length; i ++ {
                    System.out.println(constructor[i].getName());
                }

            }

            
            System.out.println(
    " ---------- " );
            Method[] method 
    =  clazz.getDeclaredMethods();  //  Method[]
             if  (method  !=   null ) {
                
    for  ( int  i  =   0 ; i  <  method.length; i ++ {
                    System.out.println(method[i].getName());
                }

            }

            
            System.out.println(
    " ---------- " );
            Field[] field 
    =  clazz.getDeclaredFields();  //  Field[]
             if  (field  !=   null ) {
                
    for  ( int  i  =   0 ; i  <  field.length; i ++ {
                    System.out.println(field[i].getName());
                    System.out.println(field[i].getType().getName());
                    System.out.println(field[i].get(testRef));
                }

            }

            
           
    //  動態生成instance(無參數)
           Class clz  =  Class.forName( " reflection.TestRef " );
            Object obj 
    =  clz.newInstance();
            System.out.println(((TestRef)obj).getStr());
            
           
    //  動態生成instance(有參數)
           Class[] params  =   new  Class[] {String. class int . class double . class } ;
            Constructor construct 
    =  clz.getConstructor(params);
           
    //  JDK1.5的情況下可以直接用{"haha",999,100.01}作為參數        
           Object obj2  =  construct.newInstance( new  Object[] { " haha " new  Integer( 999 ),  new  Double( 100.01 )} ); 
            System.out.println(((TestRef)obj2).getStr());
            
           
    //  動態調用method(public method)
           Class[] params2  =   new  Class[] {String. class } ;
            Method methods 
    =  clz.getMethod( " setStr " , params2);
            methods.invoke(testRef, 
    new  Object[] { " invoke method " } );
            System.out.println(testRef.getStr());
            
           
    //  動態改變field內容(public field)
           Field fields  =  clz.getField( " str " );
            fields.set(testRef, 
    " set field's value " );
            System.out.println(testRef.getStr());
            
        }


      
    public  TestRef() {
            System.out.println(
    " --- complete TestRef() --- " );
        }

        
       
    public  TestRef(String str,  int  i,  double  d) {
            
    this .str  =  str;
            
    this .i  =  i;
            
    this .d  =  d;
            System.out.println(
    " --- complete TestRef(String str, int i, double d) --- " );
        }

        
       
    public  String str  =   " I'm a string " ;

       
    int  i  =   1 ;

       
    double  d  =   3.14 ;

        HashMap map 
    =   new  HashMap();

        
    public   double  getD()  {
            
    return  d;
        }


       
    public   void  setD( double  d)  {
            
    this .d  =  d;
        }


       
    public   int  getI()  {
            
    return  i;
        }


       
    public   void  setI( int  i)  {
            
    this .i  =  i;
        }


       
    public  HashMap getMap()  {
            
    return  map;
        }


       
    public   void  setMap(HashMap map)  {
            
    this .map  =  map;
        }


       
    public  String getStr()  {
            
    return  str;
        }


       
    public   void  setStr(String str)  {
            
    this .str  =  str;
        }

    }


    3說明:
    上面代碼的運行環境是JDK1.4.2_08
    動態得到方法getMethod()和動態得到數據成員getField()時要求訪問級別是public的。但是相應的getDeclaredMethods() 和getDeclaredFields()可以得到private的元素。

    4補充:
    public class ReflectSecurity {
        public static void main(String[] args) {
            try {
                TwoString ts = new TwoString("a", "b");
                Field field = clas.getDeclaredField("m_s1");
    //          field.setAccessible(true);
                System.out.println("Retrieved value is " + field.get(inst));

            } catch (Exception ex) {
                ex.printStackTrace(System.out);
            }
        }
    }

    如果我們編譯這一程序時,不使用任何特定參數直接從命令行運行,它將在field.get(inst)調用中拋出一個Class異常。
    如果我們不注釋field.setAccessible (true)代碼行,那么重新編譯并重新運行該代碼,它將運行成功。
    最 后,如果我們在命令行添加了JVM參數 -Djava.security.manager 以實現安全性管理器,它仍然將不能通過運行,會拋出java.security.AccessControlException,除非我們定義了 ReflectSecurity類的許可權限。


    主站蜘蛛池模板: 啦啦啦高清视频在线观看免费 | 亚洲精品第五页中文字幕| eeuss免费天堂影院| 吃奶摸下高潮60分钟免费视频| 亚洲国产成人久久精品软件| 国产精品无码一区二区三区免费 | 亚洲日本一区二区三区在线| eeuss影院ss奇兵免费com| 亚洲第一区精品观看| 一级做α爱过程免费视频| 亚洲一区二区三区在线播放| 亚欧洲精品在线视频免费观看| 亚洲精品中文字幕乱码三区| 久9久9精品免费观看| 亚洲免费电影网站| 日本不卡高清中文字幕免费| 美女黄频a美女大全免费皮| 亚洲国产综合久久天堂| 免费久久人人爽人人爽av | 无码专区—VA亚洲V天堂| 亚洲视频免费播放| 亚洲日韩久久综合中文字幕| 国产zzjjzzjj视频全免费| 国产va免费观看| 亚洲最新永久在线观看| 免费看美女被靠到爽的视频| www永久免费视频| 亚洲无线电影官网| 国产1024精品视频专区免费| 国产成人亚洲毛片| 亚洲成AV人片天堂网无码| 性生交片免费无码看人| 国产99久久久久久免费看| 亚洲精品自在线拍| 可以免费观看的一级毛片| 免费视频精品一区二区三区| 中中文字幕亚洲无线码| 中文字幕久久亚洲一区| 国产高清不卡免费在线| 羞羞视频在线观看免费| 亚洲成a人片毛片在线|