java中反射

來源:互聯網
上載者:User

標籤:建立   ble   使用   declare   相對   類型   返回   tar   super   

 

擷取Class類的三種方式以及部分方法

package cn.lianxi.reflect;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.Date;public class Student {    public String name="小白";    private int age=24;    protected  String sex="男";    int money=180;    static {        System.out.println("這是靜態代碼塊");    }    public Student(){        System.out.println("這是建構函式");    }
 }class A{ public static void main(String []args){ try { System.out.println(); //擷取Class類的三種方式 //Student.class; 類名.class; //new Student().getClass(); 對象名.getClass(); Class cla=Class.forName("cn.lianxi.reflect.Student"); // Class.forName("全類名") System.out.println("所在的包:" + cla.getPackage().getName()); System.out.println("全類名:" + cla.getName()); System.out.println("簡寫的類名:" + cla.getSimpleName()); //擷取類的存取修飾詞,傳回值為int int num = cla.getModifiers(); // 通過Modifier的toString()就可以把int類型轉換成對應的修飾符 System.out.println(Modifier.toString(num)); } catch (ClassNotFoundException e) { e.printStackTrace(); } }}class B{ public static void main(String []args){ try { Class cla=Class.forName("cn.lianxi.reflect.Student"); // Field[] fields = c.getFields(); 只是擷取public Field[] fields = cla.getDeclaredFields(); // 擷取所有 for (int i = 0; i < fields.length; i++) { System.out.println(fields[i]); } // 擷取所有屬性的存取修飾詞 default的int值是0 沒有對應的字串類型 for (int i = 0; i < fields.length; i++) { System.out.println(Modifier.toString(fields[i].getModifiers())); } } catch (ClassNotFoundException e) { e.printStackTrace(); } }}

這是class A中mian方法運行結果

這是靜態代碼塊所在的包:cn.lianxi.reflect全類名:cn.lianxi.reflect.Student簡寫的類名:Studentpublic

這是class B 中mian方法運行結果

這是靜態代碼塊public java.lang.String cn.lianxi.reflect.Student.nameprivate int cn.lianxi.reflect.Student.ageprotected java.lang.String cn.lianxi.reflect.Student.sexint cn.lianxi.reflect.Student.moneypublicprivateprotected

建立對象

class C{    public static void main(String []args){        try {            // Student stu = new Student(); 耦合            Class c = Class.forName("cn.lianxi.reflect.Student");            Student stu = (Student) c.newInstance(); // 相對耦合        } catch (Exception e) {            e.printStackTrace();        }    }}

運行結果

這是靜態代碼塊這是建構函式

 開啟類的私人屬性開關

class D{    public static void main(String []args){        try {            Class c = Class.forName("cn.lianxi.reflect.Student");            Student stu = (Student) c.newInstance();            Field field = c.getDeclaredField("age");            // 開啟訪問私人屬性的開關            field.setAccessible(true);            System.out.println(field.get(stu));        } catch (Exception e) {            e.printStackTrace();        }    }}

運行結果

這是靜態代碼塊這是建構函式24

  

Student類中添加的私人的方法/**     * 私人的方法     */    private double getSum(double number) {        return number + 10;    }

  訪問對象私人方法

class E{    public static void main(String []args){        try {            Class c = Class.forName("cn.lianxi.reflect.Student");            Student stu = (Student) c.newInstance();            Method method = c.getDeclaredMethod("getSum", double.class);            method.setAccessible(true);            // 執行方法            double sum = (Double) method.invoke(stu, 50.0);            System.out.println(sum);        } catch (Exception e) {            e.printStackTrace();        }    }}

執行結果:

這是靜態代碼塊這是建構函式60.0

 

  • 用上述三種方式之一擷取特定類的Class類,即該類對應的位元組碼
  • 調用Class對象的getConstructor(Class<?>... parameterTypes)擷取構造方法對象
  • 調用是構造方法類ConstructornewInstance(Object... initargs)方法建立對象
  • 調用Class對象的getMethod(String name, Class<?>... parameterTypes)擷取方法對象
  • 調用方法對象類Methodinvoke(Object obj, Object... args)方法,調用對象上相應方法

數組的反射

 

package cn.lianxi.reflect;import java.util.Arrays;public class ArrayReflect {    public static void main(String[] args) {        int [] a1 = new int[]{1,2,3};        int [] a2 = new int[5];        int [][] a3 = new int[2][3];        System.out.println(a1.getClass() == a2.getClass());//true        System.out.println(a1.getClass());//class [I        System.out.println(a3.getClass());//class [[I        System.out.println(a1.getClass().getSuperclass() == a3.getClass().getSuperclass());//true        System.out.println(a2.getClass().getSuperclass());//class java.lang.Object        //下句編譯不通過:Error:(15, 42) java: 不可比較的類型: java.lang.Class<capture#1, 共 ? extends int[]>
      //和java.lang.Class<capture#2, 共 ? extends int[][]> //System.out.println(a1.getClass() == a3.getClass()); Object []b3 = a3;//通過 //下句編譯不通過 Error:(17, 24) java: 不相容的類型: int[]無法轉換為java.lang.Object[] //Object [] b1 = a1; String s1 = "abc"; System.out.println(Arrays.asList(a1));//[[[email protected]] System.out.println(Arrays.asList(s1));//[abc] }}

運行結果

trueclass [Iclass [[Itrueclass java.lang.Object[[[email protected]][abc]

設定檔載入

  •  類載入器載入唯讀設定檔
類名.class.getClassLoader().getResourceAsStream(Str);
  • 類名.class.getResourceAsStream(str),實質上還是調用類載入器。如下截取(java.lang包下的Class.java)
 public InputStream getResourceAsStream(String name) {    name = resolveName(name);    ClassLoader cl = getClassLoader0();    if (cl==null) {        // A system class.        return ClassLoader.getSystemResourceAsStream(name);    }    return cl.getResourceAsStream(name);}

關於路徑str,寫法有點講究。

  • 不加斜杠,相對路徑: str = "config.properties";
  • 加斜杠,從classpath的根路徑找: str = "/org/iot/ui/config.properties";

以前編譯java代碼時,有些conf/檔案夾還要添加進依賴或者標記成source檔案夾,裡面明明都是xml檔案,沒Java源碼。從這裡,我現在知道了,是使用反射載入設定檔的緣故

內省(Introspector) & JavaBean

JavaBean讀取屬性x的值的流程:變大寫、補首碼、擷取方法。

"x"-->"X"-->"getX"-->"MethodGetX"
  • 自己用內省操作

我目前沒用上,所以不貼代碼了,只附上核心類

簡單實現: 使用java.beans.PropertyDescriptor

麻煩實現: 使用java.beans.Introspector類,遍曆getBeanInfo方法的傳回值

JavaBean必須有一個不帶參數的建構函式

  • 使用BeanUtils工具包

    • 字串和整數轉換(對比(PropertyUtils)
    • 屬性級聯操作
    • 操作map

 

java中反射

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.