<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
       ::  ::  :: 聯(lián)系 :: 聚合  :: 管理

    Reflection是Java的一個(gè)重要特性。這種機(jī)制可以讓我們通過(guò)類(lèi)名,方法名,數(shù)據(jù)成員名來(lái)得到相關(guān)的元素。
    關(guān)鍵類(lèi)java.lang.Class:這個(gè)也是Object的子類(lèi) 是利用反射機(jī)制的起點(diǎn)。
    1:產(chǎn)生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");

    使用 類(lèi)名.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()的返回值可以包含類(lèi)的種類(lèi)信息。比如是否為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()); // 實(shí)現(xiàn)了哪些Interface
           System.out.println( " clazz.getDeclaredClasses() =  " + clazz.getDeclaredClasses()); // 包含哪些內(nèi)部類(lèi)
           System.out.println( " getDeclaringClass() =  " + clazz.getDeclaringClass()); // 如果clazz是inner class 那么返回其outer class
            
            System.out.println(
    " ---------- " );
            Constructor[] constructor 
    =  clazz.getDeclaredConstructors(); // 返回一組構(gòu)造函數(shù) 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));
                }

            }

            
           
    //  動(dòng)態(tài)生成instance(無(wú)參數(shù))
           Class clz  =  Class.forName( " reflection.TestRef " );
            Object obj 
    =  clz.newInstance();
            System.out.println(((TestRef)obj).getStr());
            
           
    //  動(dòng)態(tài)生成instance(有參數(shù))
           Class[] params  =   new  Class[] {String. class int . class double . class } ;
            Constructor construct 
    =  clz.getConstructor(params);
           
    //  JDK1.5的情況下可以直接用{"haha",999,100.01}作為參數(shù)        
           Object obj2  =  construct.newInstance( new  Object[] { " haha " new  Integer( 999 ),  new  Double( 100.01 )} ); 
            System.out.println(((TestRef)obj2).getStr());
            
           
    //  動(dòng)態(tài)調(diào)用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());
            
           
    //  動(dòng)態(tài)改變field內(nèi)容(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說(shuō)明:
    上面代碼的運(yùn)行環(huán)境是JDK1.4.2_08
    動(dòng)態(tài)得到方法getMethod()和動(dòng)態(tài)得到數(shù)據(jù)成員getField()時(shí)要求訪問(wèn)級(jí)別是public的。但是相應(yīng)的getDeclaredMethods() 和getDeclaredFields()可以得到private的元素。

    4補(bǔ)充:
    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);
            }
        }
    }

    如果我們編譯這一程序時(shí),不使用任何特定參數(shù)直接從命令行運(yùn)行,它將在field.get(inst)調(diào)用中拋出一個(gè)Class異常。
    如果我們不注釋field.setAccessible (true)代碼行,那么重新編譯并重新運(yùn)行該代碼,它將運(yùn)行成功。
    最 后,如果我們?cè)诿钚刑砑恿薐VM參數(shù) -Djava.security.manager 以實(shí)現(xiàn)安全性管理器,它仍然將不能通過(guò)運(yùn)行,會(huì)拋出java.security.AccessControlException,除非我們定義了 ReflectSecurity類(lèi)的許可權(quán)限。


    主站蜘蛛池模板: 美腿丝袜亚洲综合| 国产在线观看片a免费观看| 九九99热免费最新版| 日韩亚洲国产高清免费视频| 大陆一级毛片免费视频观看i| 国产高清视频在线免费观看| 亚洲激情电影在线| 一个人看的在线免费视频| 一边摸一边桶一边脱免费视频| 亚洲AV无码AV男人的天堂不卡 | 永久免费av无码不卡在线观看| 在线观看免费视频网站色| 亚洲免费一级视频| 大胆亚洲人体视频| 亚洲日本一区二区三区| 亚洲真人无码永久在线观看| 国产av无码专区亚洲av毛片搜| 老司机午夜精品视频在线观看免费| 麻豆一区二区三区蜜桃免费| 人人爽人人爽人人片av免费| 中文字幕在线免费看| 99久久精品免费精品国产| AA免费观看的1000部电影| 日韩高清在线免费看| 久久精品国产亚洲AV网站| 亚洲人成人无码.www石榴| 一级做a爰片久久毛片免费陪| 国产免费AV片在线播放唯爱网 | 69式互添免费视频| 亚洲成人福利在线| 国内少妇偷人精品视频免费| 国产大片免费观看中文字幕| 亚洲视频免费播放| 视频免费在线观看| 高清在线亚洲精品国产二区| a高清免费毛片久久| 亚洲ⅴ国产v天堂a无码二区| 亚洲免费福利在线视频| 亚洲?V乱码久久精品蜜桃 | 亚洲欧洲自拍拍偷精品 美利坚| 国产精品久久免费|