java反射基礎

來源:互聯網
上載者:User

標籤:調用   詳解   無法   out   methods   dex   stack   name   ack   

反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態擷取的資訊以及動態調用對象的方法的功能稱為java語言的反射機制。Link

 

反射的主要方法

方法/屬性

解釋

getDeclaredMethods()

擷取所有的方法

getReturnType()

獲得方法的放回類型

getParameterTypes()

獲得方法的傳入參數類型

getDeclaredMethod("方法名",參數類型.class,……)

獲得特定的方法

getDeclaredConstructors()

擷取所有的構造方法

getDeclaredConstructor(參數類型.class,……)

擷取特定的構造方法

getSuperclass()

擷取某類的父類

getInterfaces()

取某類實現的介面

getDeclaredField()

擷取聲明的指定屬性

getDeclaredFields()

擷取聲明的所有屬性

getField()

擷取指定屬性

getFields()

擷取所有屬性

field.get(clazz)

擷取類屬性

field.set(clazz,property);

設定類屬性

反射相關的類java.lang.Class;                java.lang.reflect.Constructor; java.lang.reflect.Field;        java.lang.reflect.Method;java.lang.reflect.Modifier;
反射訪問類的屬性        Class<?> clazz = null;        try {            clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz");            Field field = clazz.getDeclaredField("sonPwd");            field.setAccessible(true);            Object result = field.get(this);            ZLog.zzE(result);            field.set(this, "Java反射機制");            result = field.get(this);            ZLog.zzE(result);        } catch (Exception e) {            e.printStackTrace();        }
反射訪問類的方法        Class<?> clazz = null;        try {            clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz");            Method method = clazz.getMethod("getSonPwd");//            method.invoke(clazz.newInstance());            Object result = method.invoke(this);            ZLog.zzE(result);   // 不帶參數            method = clazz.getMethod("getSonEmail");            result = method.invoke(this);            ZLog.zzE(result);   // 帶參數,訪問私人方法            method = clazz.getDeclaredMethod("getSum",int.class,String.class);            method.setAccessible(true);            result = method.invoke(this,100,"isSon...");            ZLog.zzE(result);            method = clazz.getMethod("getSum",int.class,String.class);            result = method.invoke(this,100,"isSon...");            ZLog.zzE(result);        } catch (Exception e) {            e.printStackTrace();        }

參考:

     Java反射機制詳解

     Java 反射

     JAVA反射與註解

     JAVA中的反射機制

備用代碼

    /**     * 調用子類的某個方法     *  無法訪問私人方法     */    private void getSonMethod(){        Class<?> clazz = null;        try {            clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz");            Method method = clazz.getMethod("getSonPwd");//            method.invoke(clazz.newInstance());            Object result = method.invoke(this);            ZLog.zzE(result);   // 不帶參數            method = clazz.getMethod("getSonEmail");            result = method.invoke(this);            ZLog.zzE(result);   // 帶參數,訪問私人方法            method = clazz.getDeclaredMethod("getSum",int.class,String.class);            method.setAccessible(true);            result = method.invoke(this,100,"isSon...");            ZLog.zzE(result);            method = clazz.getMethod("getSum",int.class,String.class);            result = method.invoke(this,100,"isSon...");            ZLog.zzE(result);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 擷取子類所有方法     */    private void getSonMethodAll(){        Class<?> clazz = null;        try {            clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz");            Method method[] = clazz.getMethods();            for (int i = 0; i < method.length; ++i) {                Class<?> returnType = method[i].getReturnType();                Class<?> para[] = method[i].getParameterTypes();                int temp = method[i].getModifiers();                System.out.print(Modifier.toString(temp) + " ");                System.out.print(returnType.getName() + "  ");                System.out.print(method[i].getName() + " ");                System.out.print("(");                for (int j = 0; j < para.length; ++j) {                    System.out.print(para[j].getName() + " " + "arg" + j);                    if (j < para.length - 1) {                        System.out.print(",");                    }                }                Class<?> exce[] = method[i].getExceptionTypes();                if (exce.length > 0) {                    System.out.print(") throws ");                    for (int k = 0; k < exce.length; ++k) {                        System.out.print(exce[k].getName() + " ");                        if (k < exce.length - 1) {                            System.out.print(",");                        }                    }                } else {                    System.out.print(")");                }                System.out.println();            }        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        ZLog.zzE("");    }    /**     * 調用子類的某個屬性     *  可以直接存取private屬性     */    private void getSonProperty(){        Class<?> clazz = null;        try {            clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz");            Field field = clazz.getDeclaredField("sonPwd");            field.setAccessible(true);            Object result = field.get(this);            ZLog.zzE(result);            field.set(this, "Java反射機制");            result = field.get(this);            ZLog.zzE(result);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 擷取子類所有屬性     */    private void getSonPropertyAll(){        Class<?> clazz = null;        try {            clazz = Class.forName("com.simple.dec.advance.basic.basic1.SonClazz");            System.out.println("===============本類屬性===============");            // 取得本類的全部屬性            Field[] field = clazz.getDeclaredFields();            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() + ";");            }            System.out.println("==========實現的介面或者父類的屬性==========");            // 取得實現的介面或者父類的屬性            Field[] filed1 = clazz.getFields();            for (int j = 0; j < filed1.length; j++) {                // 許可權修飾符                int mo = filed1[j].getModifiers();                String priv = Modifier.toString(mo);                // 屬性類型                Class<?> type = filed1[j].getType();                System.out.println(priv + " " + type.getName() + " " + filed1[j].getName() + ";");            }        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }

 

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.