【Java 進階】Java 反射

反射

反射:獲取Class中所有字段(Field)與方法(Method),并實現調用(invoke)

Java 反射簡單使用(獲取Person類中Field與Method):

Person 類:

package com.jerry.reflect;
public class Person {
    private String mName = "LiuDongBing";
    private int mAge = 28;
   
    protected String getName() {
        LogUtils.d("getName :");
        return mName;
    }
    private void setName(String name) {
        LogUtils.d("setName :" + name);
        mName = name;
    }
    private int getAge() {
        return mAge;
    }
    public void setAge(int age) {
        mAge = age;
    }
}

反射方案:

//獲取Person類
Class mPersonClass = Class.forName("com.jerry.reflec.Person");

//獲取Person實例
Object mPersonObject = mPersonClass.newInstance();

//獲取字段(Field)
Field mPersonField = mPersonClass.getDeclaredField("mNAme");
String mName = mPersonField.getName();

//獲取方法(Method)
Method mPersonMethod01 = mPersonClass.getDeclaredMethod("getName");//獲取無參數方法
Method mPersonMethod02 = mPersonClass.getDeclaredMethod("setName",String.class);//獲取String參數的方法
//調用方法
String Name = mPersonMethod01.invoke(mPersonObject);//無參數
mPersonMethod02.invoke(mPersonObject,“JerryLiu”);//調用有參數方法,“JeryyLiu”即為傳遞參數

注意:

獲取字段與方法有多種方案,僅以獲取方法講解,(字段Field類似)

//獲取方法4種實現方案(只需使用一種):
Field mPersonMethod01 = personClass.getMethod("getNme");

Field mPersonMethod02 = personClass.getDeclaredMethod("setName",String.class);
 
//獲取Person子類,父類,與其自己所有的public 屬性的方法         
Field[] mPersonMethod03 = personClass.getMethods();

//獲取Person類中所有字段
Field[] mPersonMethod04 = personClass.getDeclaredMethods();

//打印所有字段
for (int i = 0; i < mPersonField.length ; i++) {
    LogUtils.d("Field ["+i+"]="+mPersonField[i].getName());
}

Android 系統 Jar 包方法與字段使用@Hide注解,正常方案不能使用,附屬使用android.jar 中@Hide屬性獲取代碼:

 public static String getSystemProperties(String key) {
        Class<?> mSystemProperties;
        try {
            mSystemProperties = Class.forName("android.os.SystemProperties");
            Method method = mSystemProperties.getDeclaredMethod("get", String.class);
            return (String) method.invoke(mSystemProperties.newInstance(), key);
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        catch (InstantiationException e) {
            e.printStackTrace();
        }
        return "";
    }

參考文章

Android中反射的簡單應用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,558評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,992評論 19 139
  • 你是貪官的話,你會把錢藏到哪里?總不會藏到別人家吧?那藏到自己家,你還能有多少個家?且是能經常住的家,畢竟不會找個...
    柯依生閱讀 272評論 0 0
  • 幾乎是每年,我們總會聽到一些駭人聽聞的新聞,都是那些學習壓力、人際交往、與父母慪氣的孩子,最后選擇輕生的道路。 每...
    0e644b38f764閱讀 237評論 0 0
  • 好糾結,現在的PHP集成環境都好丑呀 一個個都不想用,準備開發一個傻瓜式的PHP集成環境包 首先他要界面美觀 他要...
    某人A閱讀 266評論 0 0