1. 程式人生 > >java反射基礎

java反射基礎

per borde exceptio cti dai private align href getpara

反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為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反射基礎