IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > java學(xué)習(xí)中如何認(rèn)識反射,業(yè)內(nèi)專家告訴你

java學(xué)習(xí)中如何認(rèn)識反射,業(yè)內(nèi)專家告訴你 時間:2018-06-22      來源:未知

反射的概念

反射的概念是由 Smith 在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力。

換句話說,就是能夠得到代碼自身的特征。

換句話說,就是把類本身也看成是對象,包括類中的變量名、方法名、內(nèi)部類、超類、包、修飾符等等,都可以通過代碼來得到并被看成是對象。

java為此設(shè)計(jì)了一些類來方便我們使用反射。這些類并不多,它們分別是:Field、Constructor、Method、Class、Object,下面對這些類做一個簡單的說明。

摘抄于其它資料,僅供閱讀

Field 類:提供有關(guān)類或接口的屬性的信息,以及對它的動態(tài)訪問權(quán)限。反射的字段可能是一個類(靜態(tài))屬性或?qū)嵗龑傩,簡單的理解可以把它看成一個封裝反射類的屬性的類。

Constructor 類:提供關(guān)于類的單個構(gòu)造方法的信息以及對它的訪問權(quán)限。這個類和 Field 類不同,F(xiàn)ield 類封裝了反射類的屬性,而 Constructor 類則封裝了反射類的構(gòu)造方法。

Method 類:提供關(guān)于類或接口上某個單獨(dú)方法的信息。所反映的方法可能是類方法或?qū)嵗椒?包括抽象方法)。 這個類不難理解,它是用來封裝反射類方法的一個類。

Class 類:類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數(shù)組屬于被映射為 Class 對象的一個類,所有具有相同元素類型和維數(shù)的數(shù)組都共享該 Class 對象。

Object 類:每個類都使用 Object 作為超類。所有對象(包括數(shù)組)都實(shí)現(xiàn)這個類的方法。

獲取Class類

有一個類,類名是Class,(首字母大寫,不同于關(guān)鍵字class)。任何一個java類都是這個Class類的對象,即“類本身也是對象”的感覺。

一旦我們獲取到了一個類的Class實(shí)例,那么在此基礎(chǔ)上要獲取Field、Constructor、Method等等的話也就很容易了(因此java的所有代碼都在類中的嘛)。所以首要步驟是獲取Class實(shí)例。

獲取類自身有三種方式:

(1)利用 對象.getClass() 的方式獲取該對象的Class實(shí)例;

(2)利用 對象.class 的方式來獲取Class實(shí)例,對于基本數(shù)據(jù)類型的封裝類,還可以采用.TYPE來獲取相對應(yīng)的基本數(shù)據(jù)類型的Class實(shí)例;

(3)使用 Class類的靜態(tài)方法forName(“全路徑名”),用類的名字獲取一個Class實(shí)例。

示例

class ClassTest {

public static void main(String[] args) throws Exception {

String str1 = "abc";

Class cls1 = str1.getClass();//法一

Class cls2 = String.class;//法二

Class cls3 = Class.forName("java.lang.String");//法三

System.out.println(cls1 == cls2);

System.out.println(cls1 == cls3);

}

}

運(yùn)行結(jié)果為

true

true

解釋

1、運(yùn)行結(jié)果為true說明虛擬機(jī)為某個類只會產(chǎn)生一份字節(jié)碼,將來用這份字節(jié)碼可以產(chǎn)生多個實(shí)例對象。

2、也即是說,在運(yùn)行期間,如果我們要產(chǎn)生某個類的對象,Java虛擬機(jī)(JVM)會檢查該類型的Class對象是否已被加載。如果沒有被加載,JVM會根據(jù)類的名稱找到.class文件并加載它。一旦某個類型的Class對象已被加載到內(nèi)存,就可以用它來產(chǎn)生該類型的所有對象。

利用Class實(shí)例創(chuàng)建對象

以前我們創(chuàng)建對象都是用“new 類名()”的方式,現(xiàn)在我們先得到構(gòu)造方法,并用構(gòu)造方法來創(chuàng)建。現(xiàn)在我們要使用Consturctor(構(gòu)造器)類:它代表某個類中的一個構(gòu)造方法。

得到某個類所有的構(gòu)造方法

Constructor [] constructors = Class.forName("java.lang.String").getConstructors();

得到某一個構(gòu)造方法

Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);

注:參數(shù)是一個Class實(shí)例,即去拿匹配這樣參數(shù)的構(gòu)造方法。

創(chuàng)建實(shí)例對象,用Constructor的newInstance方法

傳統(tǒng)方式:String str=new String(new StringBuffer("abc"));

反射方式:String str=(String) constructor.newInstance(new StringBuffer("abc"));

注:newInstance()方法參數(shù)可變長,請嘗試放多個參數(shù)。不合適時,報(bào)異常IllegalArgumentException。

上述原理可以下面示例來演練

class Test {

public static void main(String[] args) throws Exception {

Class c = Class.forName("java.lang.String");

Constructor constructor = c.getConstructor(StringBuffer.class);

String str = (String) constructor.newInstance(new StringBuffer("abc"));

System.out.println(str);

}

}

利用Constructor來創(chuàng)建實(shí)例與利用Class類來創(chuàng)建實(shí)例

class類也有創(chuàng)建實(shí)例的方法,下面的例子進(jìn)行了展示。

此例來源于//seahb.iteye.com/blog/855107。

import java.lang.reflect.Constructor;

class A {

private A() { // 將private改為public試試

System.out.println("A's constructor A() is called.");

}

private A(int a, int b) {

System.out.println("A's constructor A(a,b) is called.");

System.out.println("a:" + a + " b:" + b);

}

}

class B {

public static void main(String[] args) {

B b = new B();

System.out.println("通過Class.NewInstance()調(diào)用私有構(gòu)造函數(shù):");

b.byClassNewInstance();

System.out.println("通過Constructor.newInstance()調(diào)用私有構(gòu)造函數(shù):");

b.byConstructorNewInstance();

}

/* 法一:通過Class.NewInstance()創(chuàng)建新的類示例 */

private void byClassNewInstance() {

try {

Class c = Class.forName("A");

A a = (A) c.newInstance();//調(diào)用無參構(gòu)造方法。如果方法是私有的,則運(yùn)行時會異常IllegalAccessException

} catch (Exception e) {

e.printStackTrace();

System.out.println("通過Class.NewInstance()調(diào)用構(gòu)造方法【失敗】");

}

}

/*法二:通過Constructor.newInstance()創(chuàng)建新的類示例 */

private void byConstructorNewInstance() {

try {

Class c = Class.forName("A");

Constructor c0 = c.getDeclaredConstructor();/* 調(diào)用無參構(gòu)造方法 */

c0.setAccessible(true); //必須設(shè)置一下可見性后就可調(diào)用了

A a0 = (A) c0.newInstance();//調(diào)用構(gòu)造方法

System.out.println("成功1");

Constructor c1 = c.getDeclaredConstructor(new Class[] { int.class, int.class });/* 調(diào)用帶參構(gòu)造方法 */

c1.setAccessible(true);

//A a1 = (A) c1.newInstance(new Object[] { 5, 6 });//參數(shù)是對象數(shù)組

A a1 = (A) c1.newInstance(5, 6);//參數(shù)可連寫,因?yàn)閚ewInstance()支持可變參數(shù)

//A a1 = (A) c1.newInstance(5, 6,7);//參數(shù)若不合適,則就報(bào)異常IllegalArgumentException

System.out.println("成功2");

} catch (Exception e) {

e.printStackTrace();

}

}

}

結(jié)論

class.newInstance和constructor.newInstance 區(qū)別

通過反射創(chuàng)建新的類示例,有兩種方式:

Class.newInstance()

Constructor.newInstance()

Class.newInstance() 只能夠調(diào)用無參的構(gòu)造函數(shù),即默認(rèn)的構(gòu)造函數(shù);

Constructor.newInstance() 可以根據(jù)傳入的參數(shù),調(diào)用任意構(gòu)造構(gòu)造函數(shù)。

Class.newInstance() 要求被調(diào)用的構(gòu)造函數(shù)是可見的,也即必須是public類型的;

Constructor.newInstance() 在特定的情況下,可以調(diào)用私有的構(gòu)造函數(shù)。

如果被調(diào)用的類的構(gòu)造函數(shù)為默認(rèn)的構(gòu)造函數(shù),采用Class.newInstance()則是比較好的選擇,一句代碼就OK;如果是調(diào)用帶參構(gòu)造函數(shù)、私有構(gòu)造函數(shù),就需要采用Constractor.newInstance(),兩種情況視使用情況而定。不過Java Totorial中推薦采用Constractor.newInstance()。

上一篇:讓你從根本上了解系統(tǒng)函數(shù),簡單快速

下一篇:java編程中遇到的異常以及異常的一些處理

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號-5,京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 商易网-b2b电子商务平台网站大全免费B2B发布供求信息网站 | 品牌服装网-服装品牌加盟招商,服装品牌排行榜,服装品牌大全 | 数控落地镗铣床_数控刨台式镗铣床_数控龙门加工中心-青岛辉腾机械设备有限公司 | 亚洲一区日韩一区欧美一区a,中文字幕乱妇无码AV在线,欧美日韩免费在线观看,国产精品一区二区三区免费,日韩精品免费一线在线观看,日韩一本在线,国产呦精品一区二区三区下载,国产日韩精品一区二区在线观看,欧美日韩高清一区二区三区,日韩在线免费观看视频,欧美日韩一区在线观看 | 振动给料机_电磁振动给料机_振动给料机厂家-新乡市大汉振动机械有限公司 | 上海中泉泵业制造有限公司-柴油机泵,一体化泵站,柴油机消防泵,泵站,预制一体化泵站 | 江苏上上电缆集团——上上电缆 上上品质 | 长沙物流公司|湖南货物运输公司|长沙第三方物流公司-国联物流 湖南第三方物流专家 | 长沙天为工程机械制造有限公司 | 四合扣-工字扣-帽钉(831,200,警用,大拉力四合扣)-永嘉县鑫达钮扣有限公司 | 亚克力游泳池_透明/空中/无边泳池_别墅亚克力泳池设计生产厂家_瑞地格乐-深圳他拍档 | 容积式换热器,半容积式换热器-绍兴市压力容器有限公司 | 联系我们果博东方在线开户客服电话:19038688886 - 黑龙江旺广机械设备有限公司 | 升降炉|推板炉|创卓炉业| 破碎机锤头-耐磨锤头-合金锤头-河南磐石耐磨材料有限公司 | 实验反应釜,高压反应釜,玻璃反应釜,不锈钢反应釜-烟台招远松岭化工设备有限公司 | 耐磨钢板_复合耐磨板_KN60耐磨钢板-北京耐默公司 | 久久91精品久久91综合_国产亚洲自拍一区_国产精品第1页_亚洲高清视频一区_91成人午夜在线精品_亚洲国产精品网站在线播放_亚洲国产成人久久综合区_国产精品亚洲专区在线观看_免费视频精品一区二区三区 | 南京三维动画制作公司,企业视频制作,视频拍摄,FLASH动画设计,宣传片拍摄,广告片制作 | 江西同欣机械制造股份有限公司| 湖南长沙手术室、实验室、无尘室、洁净室、无尘车间的净化工程装修公司-福临建设 | 直流电机调速器,直流电机控制器,直流电机调速电源-淄博诚铖创惠电子有限公司 | 厦门海为科技有限公司 - 工业物联网|国产PLC|HMI|SCADA | 气泡式洗菜机-气泡喷淋清洗机-喷淋清洗风干线-诸城市迪凯工业装备有限公司 | 门禁控制器-自动道闸-停车场系统-车位引导系统-车牌识别系统-楼宇对讲-可视门铃-门禁一卡通-河北京鹏电子科技有限公司 | 泰安兴润建材有限公司,泰安井盖定做,泰安警示桩定做,泰安雨水篦子定做,泰安操场篦子定做,泰安标志牌定做 | 石家庄LED显示屏|石家庄显示屏|河北显示屏升级改造|石家庄科航光电科技有限公司_石家庄科航光电科技有限公司 | 数控落地镗铣床_数控刨台式镗铣床_数控龙门加工中心-青岛辉腾机械设备有限公司 | 饲料设备_饲料加工设备_饲料成套加工设备专业提供商-河南杰昌机械设备有限公司 | 天津佳创博为科技有限公司|AGV控制器|无人搬运车|磁导航传感器|AGV专业零配件 | 柯赛德斯-加美润滑油-专业做汽车工业润滑油品牌加盟代理 | 实验室超纯水机-超纯水机-超纯水仪-上海赫恩实业有限公司 | 网咖网址导航,网咖分类目录,网址目录,免费收录国内外、各行业优秀网站网站。 | 长沙升阳化工材料有限公司 | 石墨热场|PECVD石墨舟|碳碳框|燃料电池双极板|半导体石墨|光纤用石墨模具|石墨电极加工|石墨制品|上海弘竣新能源材料有限公司 | 皮带清扫器-皮带聚氨酯合金空段输送带清扫器刮刀厂家-衡水格锐特机械科技有限公司 | 上海轮毂生产厂家-改装轮毂-锻造轮毂价格-上海毂信汽车零部件有限公司 | 宿迁代账公司,专业会计查账,代理工商注册,商标注册,专利申请,公司注册哪家好-中方会计事务所 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 雷达液位计_耐磨热电偶_蒸汽_柴油,汽油_天然气流量计_巴歇尔槽_一体化温度变送器-江苏翔腾仪表有限公司 | 学校直饮水机-反渗透纯水设备-家用净水器厂家-广州颖圣能源设备 学校洗碗机-郑州洗碗机厂家-商用洗碗机-郑州旭申环保科技有限公司 |