java反射機制學習筆記及例子代碼

來源:互聯網
上載者:User

標籤:

Java 反射的API

 

      反射中常常用的幾個類如下所示:

java.lang 包中:

--Class 類:代表一個類

    Java 中,無論產生某個類的多少個對象,這些對象都會對應同一個 Class 對象

Java.lang.reflect 包中:

--Field 類:代表類的成員變數(類的屬性)

--Method 類:代表類的方法,一個方法對應一個 Method 對象

--Constructor 類:代表類的構造方法

--Array 類:提供動態建立數組,以及訪問數組的元素的靜態方法

利用反射機制調用某個類中的某個方法的步驟:

1.  擷取該類的 Class 對象

常用方法有三種:

a)  通過 Class 的 forName 的靜態方法獲得(參數:包名 + 類名):

Class<?> classType = Class.forName("java.lang.String");

b)  通過類名 + 點 class 的方法獲得:

     Class<?> c = String.class;

通過類的對象的 getClass 的方法獲得:

String str = "test";

Class<?> typeClass = str.getClass();

2.  執行個體化一個該類的對象

兩種方法:

a)       通過 Class 對象的 newInstance 的方法建立(該方法只對無參構造方法適用):

Class<?> classType = Class.forName("java.lang.String");

Object obj = = classType.newInstance();

b)      通過擷取 Constructor 構造方法類的對象,然後通過該對象的 newInstance (Object ... initargs) 方法獲得:

Class<?> classType = cus.getClass();

Constructor con

= classType.getConstructor(new Class[]{String.class,int.class});

Object object

     = con.newInstance(new Object[]{cus.getName(),cus.getAge()});

     該方法中的若寫成兩個參數寫成 Class[]{} 和 new Object[ ]{} ,就等同於 a) 的方法

3. 擷取目標方法的 Method 對象

Method method = classType.getMethod ( methodname,new Class[]{ 參數類型 .class} ) ;

 

4. 用 Method 對象調用目標方法:

Object result = method.invoke(object,new Object[]{});

// 其中 object 為擁有該方法的對象, object[]{} 為該方法的參數

5. 擷取類中的屬性值, get 取值, set 賦值

// 擷取屬性列表

Field fields[] = classType.getDeclaredFields();

          Field field = classType.getDeclaredFields( 屬性名稱 );

       // 擷取“屬性名稱”對應 Field 對象

       field.set( 類的對象, value);

       // 給屬性賦新值

 

例子:訪問被private 修飾的方法和屬性

採用反射機制,訪問下邊的類:

public class Private{    private String name = "張三";        private String getName()    {        return name;    }}

把該類中private修飾的 name 值改成“李四”,並且用反射機制調用 getName 方法,返回修改後的值。

package com.wangzhuo.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class PrivateTest{    public static void main(String[] args)throws Exception    {        //擷取Private類的Class對象&nbsp;       Class<?> classType = Class.forName("com.wangzhuo.reflect.Private");        &nbsp;//擷取其構造方法對應的Constructor對象        Constructor con = classType.getDeclaredConstructor(new Class[]{});        &nbsp;//建立Private的對象        Object object =con.newInstance(new Object[]{});&nbsp;      //擷取Private類中name屬性對應的Field對象        Field field = classType.getDeclaredField("name");&nbsp;       //設定避開java存取控制檢測        field.setAccessible(true);       &nbsp;//擷取修改前的值        Object str = field.get(object);       &nbsp;System.out.println("修改之前name的值:"+(String)str);       &nbsp;//給name屬性賦值        field.set(object, "李四");      &nbsp;//擷取getName方法對應的Method對象        Method getNameMethod = classType.getDeclaredMethod("getName", new Class[]{});       &nbsp;//設定避開java存取控制檢測        getNameMethod.setAccessible(true);       &nbsp;//調用方法,傳回值        Object  o = getNameMethod.invoke(object, new Object[]{});        System.out.println("修改之後name的值:"+(String)o);    }}

 

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.