天天學點java_反射

  反射的方法有三種:Class.forName("Reflect.Demo");new Demo().getClass();Demo.class.全部的對象的類都是Class類的一個實例對象.java

  反射後的類對象名:clazz(自定義).spa

  加入了Declared的都是反射的類裏面的 好比上面反射Reflect.Demo. Declared就指Demo, 沒有Declared的就指實現的接口.或者父類的類Class.code

好比Field[] field = clazz.getDeclaredFields();//獲取本類屬性對象

  Field[] filed1 = clazz.getFields();//實現的接口或者父類的屬性blog

  帶Modifiers 都是權限修飾符好比public ,private,protect. protect只能同一個包引用:獲取權限修飾符名.field 都是指代屬性 Type指代類型:String,int等不過會把包名也獲得接口

    

Class<?> clazz=Class.forName("reflect.MyPerson");
Field[] field = clazz.getDeclaredFields(); System.out.println(field[0].getName());//獲取屬性名 for (int i = 0; i < field.length; i++) { // 權限修飾符 int mo = field[i].getModifiers(); String priv = Modifier.toString(mo); // 屬性類型 Class<?> type = field[i].getType(); System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";"); }

實現反射類的方法get

//調用Person類中的sayChina方法
        Method method;
        try {
            method = clazz.getMethod("sayChina");//調用的方法名sayChina ,
            method.invoke(clazz.newInstance());
            //調用Person的sayHello方法
            method=clazz.getMethod("sayHello", String.class,int.class);//調用的方法名,有參數的話,把參數的類名告訴它,知道調用那個方法
            method.invoke(clazz.newInstance(),"Rollen",20);//new了一個要實例的變量,以後給裏面要調用的方法,傳入參數
            
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }

獲取反射類的屬性,修改反射類的屬性string

Field field2=null;
        try {
            Object obj = clazz.newInstance();
            field2=clazz.getDeclaredField("name");//有name-->public, sex--->private
            field2.setAccessible(true);//屬性的修飾符爲private 不加這句不行, 若是爲public,這個就能夠不加
            field2.set(obj, "男");//獲取obj的實例對象,而後改變obj裏面sex的屬性的值
            System.out.println(field2.get(obj));
            
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
相關文章
相關標籤/搜索