如何理解反射調(diào)用成員

本篇內(nèi)容主要講解“如何理解反射調(diào)用成員”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何理解反射調(diào)用成員”吧!

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站制作、蒼南網(wǎng)絡(luò)推廣、小程序定制開發(fā)、蒼南網(wǎng)絡(luò)營(yíng)銷、蒼南企業(yè)策劃、蒼南品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供蒼南建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:bm7419.com

反射調(diào)用成員

類結(jié)構(gòu)中的最后一個(gè)核心的組成就是成員(Field),大部分情況下都會(huì)將其稱為成員屬性,對(duì)于成員信息的獲取也是通過Class類完成,在這個(gè)類中提供了如下兩組操作方法:
獲取本類全部成員:
public Field[] getDeclaredFields() throws SecurityException
獲取本類指定成員:
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException
獲取父類全部成員:public Field[] getFields() throws SecurityException
獲取父類指定成員:public Field getField(String name) throws NoSuchFieldException, SecurityException

范例:修改要操作的父類:
AbstractBase:

public abstract class AbstractBase {protected static final String BASE = "www.mldn.cn";private String info = "HELLO MLDN";public AbstractBase() {}public AbstractBase(String msg) {}
}

IChannelService:

public interface IChannelService {
    public static final String NAME = "mldnjava";
    public boolean connect();
}

范例:獲取類中的成員

import java.lang.reflect.Field;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        {    // 獲取父類之中公共成員信息 Field fields [] = cls.getFields();  //獲取成員 for (Field fie : fields) {
                System.out.println(fie);
             }
        }
        System.out.println("---------番茄醬與辣椒醬的分割線-------------");
        {  //獲取子類中定義的成員Field fields [] = cls.getDeclaredFields();for (Field fie : fields){
                System.out.println(fie);
            }
        }
    }
}

執(zhí)行結(jié)果:
如何理解反射調(diào)用成員

但是在Field類中最為重要的操作形式并不是獲取全部成員,而是如下三個(gè)方法:
設(shè)置屬性內(nèi)容:
public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException
獲取屬性內(nèi)容:
public Object get(Object obj) throws IllegalArgumentException, IllegalAccessException
解除封裝:
public void setAccessible(boolean flag)
所有成員是在對(duì)象實(shí)例化后進(jìn)行空間分配的,所以此時(shí)一定要先有實(shí)例化對(duì)象后才可以進(jìn)行成員的操作。

范例:直接調(diào)用Person類中的name私有成員

import java.lang.reflect.Field;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        Object obj = cls.getConstructor().newInstance();  //實(shí)例化對(duì)象(分配成員空間)Field nameField = cls.getDeclaredField("name");  //獲取成員對(duì)象nameField.setAccessible(true);  //對(duì)私有屬性必須先解除封裝,nameField.set(obj,"番茄強(qiáng)");  //等價(jià)于:Person對(duì)象.name = "番茄強(qiáng)"System.out.println(nameField.get(obj));
    }
}

通過一系列的分析可以發(fā)現(xiàn),類中的構(gòu)造、方法、成員屬性都可以通過反射實(shí)現(xiàn)調(diào)用,但是對(duì)于成員的反射很少這樣直接處理,大部分操作都應(yīng)該setter和getter處理,所以對(duì)于以上的代碼只能夠說是反射的特色,但是不具備實(shí)際的使用能力,而對(duì)于Field類在實(shí)際開發(fā)中只有一個(gè)方法最為常用:
獲取成員類型:
public Class<?> getType()
范例:獲取Person類中name成員的類型

import java.lang.reflect.Field;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        Field nameField = cls.getDeclaredField("name");System.out.println(nameField.getType().getName());  //獲取完整的名稱,包.類 java.lang.StringSystem.out.println(nameField.getType().getSimpleName());  // 獲取類名稱 String}
}

在以后開發(fā)中進(jìn)行反射處理的時(shí)候,往往會(huì)利用Field類和Method類實(shí)現(xiàn)類中的setter方法的調(diào)用。

到此,相信大家對(duì)“如何理解反射調(diào)用成員”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

新聞標(biāo)題:如何理解反射調(diào)用成員
瀏覽路徑:http://bm7419.com/article40/psseho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、ChatGPT、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司