本篇內(nèi)容主要講解“如何理解反射調(diào)用成員”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(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è)策劃、蒼南品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供蒼南建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
類結(jié)構(gòu)中的最后一個(gè)核心的組成就是成員(Field),大部分情況下都會將其稱為成員屬性,對于成員信息的獲取也是通過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é)果:
但是在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)
所有成員是在對象實(shí)例化后進(jìn)行空間分配的,所以此時(shí)一定要先有實(shí)例化對象后才可以進(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í)例化對象(分配成員空間)Field nameField = cls.getDeclaredField("name"); //獲取成員對象nameField.setAccessible(true); //對私有屬性必須先解除封裝,nameField.set(obj,"番茄強(qiáng)"); //等價(jià)于:Person對象.name = "番茄強(qiáng)"System.out.println(nameField.get(obj)); } }
通過一系列的分析可以發(fā)現(xiàn),類中的構(gòu)造、方法、成員屬性都可以通過反射實(shí)現(xiàn)調(diào)用,但是對于成員的反射很少這樣直接處理,大部分操作都應(yīng)該setter和getter處理,所以對于以上的代碼只能夠說是反射的特色,但是不具備實(shí)際的使用能力,而對于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í)候,往往會利用Field類和Method類實(shí)現(xiàn)類中的setter方法的調(diào)用。
到此,相信大家對“如何理解反射調(diào)用成員”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!