




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
本文格式為Word版,下載可任意編輯——Java反射機(jī)制學(xué)習(xí)總結(jié)Java反射機(jī)制學(xué)習(xí)總結(jié)
一、什么是反射機(jī)制
簡(jiǎn)樸的來(lái)說(shuō),反射機(jī)制指的是程序在運(yùn)行時(shí)能夠獲取自身的信息。在java中,只要給定類(lèi)的名字,那么就可以通過(guò)反射機(jī)制來(lái)獲得類(lèi)的全體信息。
二、哪里用到反射機(jī)制
有些時(shí)候,我們用過(guò)一些學(xué)識(shí),但是并不知道它的專(zhuān)業(yè)術(shù)語(yǔ)是什么,在剛剛學(xué)jdbc時(shí)用過(guò)一行代碼,Class.forNamecom.mysql.jdbc.Driver.class.newInstance;但是那時(shí)候只知道那行代碼是生成驅(qū)動(dòng)對(duì)象實(shí)例,并不知道它的概括含義。聽(tīng)了反射機(jī)制這節(jié)課后,才知道,原來(lái)這就是反射,現(xiàn)在好多開(kāi)框架都用到反射機(jī)制,hibernate、struts都是用反射機(jī)制實(shí)現(xiàn)的。
三、反射機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)
為什么要用反射機(jī)制?直接創(chuàng)造對(duì)象不就可以了嗎,這就涉及到了動(dòng)態(tài)與靜態(tài)的概念,
靜態(tài)編譯:在編譯時(shí)確定類(lèi)型,綁定對(duì)象,即通過(guò)。
動(dòng)態(tài)編譯:運(yùn)行時(shí)確定類(lèi)型,綁定對(duì)象。動(dòng)態(tài)編譯最大限度發(fā)揮了java的生動(dòng)性,表達(dá)了多態(tài)的應(yīng)用,有以降低類(lèi)之間的藕合性。
一句話,反射機(jī)制的優(yōu)點(diǎn)就是可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)造對(duì)象和編譯,表達(dá)出很大的生動(dòng)性,更加是在J2EE的開(kāi)發(fā)中它的生動(dòng)性就表現(xiàn)的特別明顯。譬如,一個(gè)大型的軟件,不成能一次就把把它設(shè)計(jì)的很完備,當(dāng)這個(gè)程序編譯后,發(fā)布了,當(dāng)察覺(jué)需要更新某些功能時(shí),我們不成能要用戶(hù)把以前的卸載,再重新安裝新的版本,假使這樣的話,這個(gè)軟件斷定是沒(méi)有多少人用的。采用靜態(tài)的話,需要把整個(gè)程序重新編譯一次才可以實(shí)現(xiàn)功能的更新,而采用反射機(jī)制的話,它就可以不用卸載,只需要在運(yùn)行時(shí)才動(dòng)態(tài)的創(chuàng)造和編譯,就可以實(shí)現(xiàn)該功能。
它的缺點(diǎn)是對(duì)性能有影響。使用反射根本上是一種解釋操作,我們可以報(bào)告JVM,我們夢(mèng)想做什么并且它得志我們的要求。這類(lèi)操作總是慢于只直接執(zhí)行一致的操作。
四、利用反射機(jī)制能獲得什么信息
一句話,類(lèi)中有什么信息,它就可以獲得什么信息,不過(guò)前提是得知道類(lèi)的名字,要不就沒(méi)有后文了首先得根據(jù)傳入的類(lèi)的全名來(lái)創(chuàng)造Class對(duì)象。
Classc=Class.forNameclassName;注明:className務(wù)必為全名,也就是得包含包名,譬如,java.pojo.UserInfo;
Objectobj=c.newInstance;//創(chuàng)造對(duì)象的實(shí)例
OK,有了對(duì)象就什么都好辦了,想要什么信息就有什么信息了。
獲得構(gòu)造函數(shù)的方法
ConstructorgetConstructorClass[]params//根據(jù)指定參數(shù)獲得public構(gòu)造器
Constructor[]getConstructors//獲得public的全體構(gòu)造器
ConstructorgetDeclaredConstructorClass[]params//根據(jù)指定參數(shù)獲得public和非public的構(gòu)造器
Constructor[]getDeclaredConstructors//獲得public的全體構(gòu)造器
獲得類(lèi)方法的方法
MethodgetMethodStringname,Class[]params,根據(jù)方法名,參數(shù)類(lèi)型獲得方法
Method[]getMethods//獲得全體的public方法
MethodgetDeclaredMethodStringname,Class[]params//根據(jù)方法名和參數(shù)類(lèi)型,獲得public和非public的方法
Method[]getDeclaredMethods//獲得所以的public和非public方法
獲得類(lèi)中屬性的方法
FieldgetFieldStringname//根據(jù)變量名得到相應(yīng)的public變量
Field[]getFields//獲得類(lèi)中所以public的方法
FieldgetDeclaredFieldStringname//根據(jù)方法名獲得public和非public變量
Field[]getDeclaredFields//獲得類(lèi)中全體的public和非public方法
常用的就這些,知道這些,其他的都好辦……
五、用反射機(jī)制能干什么事
剛開(kāi)頭在使用jdbc時(shí)侯,在編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)時(shí)寫(xiě)到想吐,有八個(gè)表,每個(gè)表都有增刪改查中操作,那時(shí)候還不知道有反射機(jī)制這個(gè)概念,所以就對(duì)不同的表創(chuàng)造不同的dao類(lèi),這樣不僅開(kāi)發(fā)速率地,而且代碼冗余的厲害,最要命的是看著差不多的,然后直接復(fù)制修改,由于輕易犯各種低級(jí)的錯(cuò)誤(大小寫(xiě)啊,多一個(gè)或少一個(gè)字母啊……),一個(gè)錯(cuò)誤就可以讓你找半天。
有了java反射機(jī)制,什么都好辦了,只需要寫(xiě)一個(gè)dao類(lèi),四個(gè)方法,增刪改查,傳入不同的對(duì)象,就OK啦,無(wú)需為每一個(gè)表都創(chuàng)造dao類(lèi),反射機(jī)制會(huì)自動(dòng)幫我們完成剩下的事情,這就是它的好處。說(shuō)白了,反射機(jī)制就是特意幫我們做那些重復(fù)的有規(guī)矩的事情,所以現(xiàn)在好多的自動(dòng)生成代碼的軟件就是運(yùn)用反射機(jī)制來(lái)完成的,只要你按照規(guī)矩輸入相關(guān)的參數(shù),所以低級(jí)的程序員逐漸的就被抹殺了,為什么?由于代碼都不用寫(xiě)了,隨意一個(gè)人都會(huì)開(kāi)發(fā),還要程序員干什么???所以我們只有一條出路,那就是努力努力再努力,成為高級(jí)程序員,特意開(kāi)發(fā)傻瓜軟件,讓其他程序員到一邊涼快去,呵呵~
六、用反射機(jī)制實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的增、查例子
根本原理;保存數(shù)據(jù)時(shí),把需要保存的對(duì)象的屬性值全部取出來(lái)再拼湊sql語(yǔ)句查詢(xún)時(shí),將查詢(xún)到的數(shù)據(jù)全部包裝成一個(gè)java對(duì)象。
嬉戲規(guī)矩:俗話說(shuō)的好,無(wú)法則不成方圓,更加是程序來(lái)說(shuō),它只能做有規(guī)矩的事情,沒(méi)有規(guī)矩的它干不了,好,那就先定規(guī)矩
1)數(shù)據(jù)庫(kù)的每一個(gè)表對(duì)象一個(gè)pojo類(lèi),表中的每一個(gè)字段對(duì)應(yīng)pojo類(lèi)的.中的一個(gè)屬性。并且pojo類(lèi)的名字和表的名字一致,屬性名和字段名一致,大小寫(xiě)沒(méi)有關(guān)系,由于數(shù)據(jù)庫(kù)一般不區(qū)分大小寫(xiě)
2)為pojo類(lèi)中的每一個(gè)屬性添加標(biāo)準(zhǔn)的set和get方法。
有了嬉戲規(guī)矩,那么開(kāi)頭嬉戲吧。
1、首先數(shù)據(jù)庫(kù)的有一個(gè)表,假設(shè)數(shù)據(jù)庫(kù)名稱(chēng)為:blogsystem,里面的一個(gè)表名userinfo。如圖:
2、創(chuàng)造對(duì)應(yīng)的pojo類(lèi):
復(fù)制代碼代碼如下:
java.pojo;
publicclassUserInfo
privateintid;
privateStringname;
privateStringpwd;
privateintage;
@Override
publicStringtoString
returnUserInfo[id=+id+,name=+name+,pwd=+pwd+,age=
+age+];
publicintgetId
returnid;
publicvoidsetIdintid
this.id=id;
publicStringgetName
returnname;
publicvoidsetNameStringname
=name;
publicStringgetPwd
returnpwd;
publicvoidsetPwdStringpwd
this.pwd=pwd;
publicintgetAge
returnage;
publicvoidsetAgeintage
this.age=age;
2、編寫(xiě)獲得數(shù)據(jù)庫(kù)連接的工廠類(lèi):
復(fù)制代碼代碼如下:
java.factory;
importjava.sql.Connection;
importjava.sql.DriverManager;
publicclassConnect2DBFactory
publicstaticConnectiongetDBConnection
Connectionconn=null;
try
Class.forNamecom.mysql.jdbc.Driver;
Stringurl=jdbc:mysql://localhost:3306/blogsystem;
Stringuser=root;
Stringpassword=netjava;
conn=DriverManager.getConnectionurl,user,password;
catchExceptione
e.printStackTrace;
returnconn;
3、好戲開(kāi)頭啦,編寫(xiě)操作數(shù)據(jù)庫(kù)的dao類(lèi)
復(fù)制代碼代碼如下:
java.session;
importjava.lang.reflect.Field;
importjava.lang.reflect.Method;
importjava.sql.Connection;
importjava.sql.PreparedStatement;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
importjava.util.ArrayList;
importjava.util.List;
java.factory.Connect2DBFactory;
java.pojo.UserInfo;
publicclassNetJavaSession
/**
*解析出保存對(duì)象的sql語(yǔ)句
*
*@paramobject
*:需要保存的對(duì)象
*@return:保存對(duì)象的sql語(yǔ)句
*/
publicstaticStringgetSaveObjectSqlObjectobject
//定義一個(gè)sql字符串
Stringsql=into;
//得到對(duì)象的類(lèi)
Classc=object.getClass;
//得到對(duì)象中全體的方法
Method[]methods=c.getMethods;
//得到對(duì)象中全體的屬性
Field[]fields=c.getFields;
//得到對(duì)象類(lèi)的名字
StringcName=c.getName;
//從類(lèi)的名字中解析出表名
StringtableName=cName.substringcName.lastIndexOf.+1,
cName.length;
sql+=tableName+;
ListmList=newArrayList;
ListvList=newArrayList;
forMethodmethod:methods
StringmName=method.getName;
ifmName.startsWithget!mName.startsWithgetClass
StringfieldName=mName.substring3,mName.length;
mList.addfieldName;
System.out.println字段名字+fieldName;
try
Objectvalue=method.invokeobject,null;
System.out.println執(zhí)行方法返回的值:+value;
ifvalueinstanceofString
vList.add+value+;
System.out.println字段值+value;
else
vList.addvalue;
catchExceptione
e.printStackTrace;
forinti=0;imList.size;i++
ifimList.size-1
sql+=mList.geti+,;
else
sql+=mList.geti+values;
forinti=0;ivList.size;i++
ifivList.size-1
sql+=vList.geti+,;
else
sql+=vList.geti+;
returnsql;
publicstaticListgetDatasFromDBStringtableName,intId
returnnull;
/**
*將對(duì)象保存到數(shù)據(jù)庫(kù)中
*
*@paramobject
*:需要保存的對(duì)象
*@return:方法執(zhí)行的結(jié)果;1:表示告成,0:表示失敗
*/
publicintsaveObjectObjectobject
Connectioncon=Connect2DBFactory.getDBConnection;
Stringsql=getSaveObjectSqlobject;
try
//Statementstatement=Statementcon.createStatement;
PreparedStatementpsmt=con.prepareStatementsql;
psmt.executeUpdate;
return1;
catchSQLExceptione
e.printStackTrace;
return0;
/**
*從數(shù)據(jù)庫(kù)中取得對(duì)象
*
*@paramarg0
*:對(duì)象所屬的類(lèi)
*@paramid
*:對(duì)象的id
*@return:需要查找的對(duì)象
*/
publicObjectgetObjectStringclassName,intId
//得到表名字
StringtableName=className.substringclassName.lastIndexOf.+1,
className.length;
//根據(jù)類(lèi)名來(lái)創(chuàng)造Class對(duì)象
Classc=null;
try
c=Class.forNameclassName;
catchClassNotFoundExceptione1
e1.printStackTrace;
//拼湊查詢(xún)sql語(yǔ)句
Stringsql=select*from+tableName+whereId=+Id;
System.out.println查找sql語(yǔ)句:+sql;
//獲得數(shù)據(jù)庫(kù)鏈接
Connectioncon=Connect2DBFactory.getDBConnection;
//創(chuàng)造類(lèi)的實(shí)例
Objectobj=null;
try
Statementstm=con.createStatement;
//得到執(zhí)行查尋語(yǔ)句返回的結(jié)果集
ResultSetset=stm.executeQuerysql;
//得到對(duì)象的方法數(shù)組
Method[]methods=c.getMethods;
//遍歷結(jié)果集
whileset.next
obj=c.newInstance;
//遍歷對(duì)象的方法
forMethodmethod:methods
StringmethodName=method.getName;
//假設(shè)對(duì)象的方法以set開(kāi)頭
ifmethodName.startsWithset
//根據(jù)方法名字得到數(shù)據(jù)表格中字段的名字
StringcolumnName=methodName.substring3,
methodName.length;
//得到方法的參數(shù)類(lèi)型
Class[]parmts=method.getParameterTypes;
ifparmts[0]==String.class
//假設(shè)參數(shù)為String類(lèi)型,那么從結(jié)果集中按照列名取得對(duì)應(yīng)的值,并且執(zhí)行改set方法
method.invokeobj,set.getStringcolumnName;
ifparmts[0]==int.class
method.invokeobj,set.getIntcolumnName;
catchExceptione
e.printStackTrace;
returnobj;
4、開(kāi)頭測(cè)試效果怎么樣:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 行政管理專(zhuān)科考試2025試題及答案總結(jié)
- 漢語(yǔ)拼音課件
- 2025年語(yǔ)文考試內(nèi)容深度剖析試題及答案
- 藥學(xué)職業(yè)道德與社會(huì)責(zé)任試題及答案
- 漢字與文化課件
- 幼兒園家長(zhǎng)會(huì)
- 兒童法律教育
- 行政法學(xué)創(chuàng)新理論試題及答案
- 毛細(xì)支氣管炎護(hù)理課件
- 邯濟(jì)鐵路擴(kuò)能改造工程指導(dǎo)性施組課件(王總講解版)
- 2024年阿壩州黑水縣招聘社區(qū)工作者考試真題
- 內(nèi)鏡洗消相關(guān)試題及答案
- 2024年中國(guó)鐵路國(guó)際有限公司招聘真題
- 石油化工閥門(mén)檢修及維護(hù)措施
- 2024年廣西物流職業(yè)技術(shù)學(xué)院招聘教職人員筆試真題
- 2024-2025湘科版小學(xué)科學(xué)四年級(jí)下冊(cè)期末考試卷及答案(三套)
- 大型海上發(fā)電用雙燃料燃?xì)廨啓C(jī)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級(jí)戰(zhàn)略研究報(bào)告
- 工程承包再轉(zhuǎn)讓合同協(xié)議
- (廣東二模)2025年廣東省高三高考模擬測(cè)試(二)歷史試卷(含答案)
- 2025湖南建投集團(tuán)春季校園招聘239人筆試參考題庫(kù)附帶答案詳解
- 2025-2030全球冰雪產(chǎn)業(yè)經(jīng)營(yíng)效益與發(fā)展投資策略建議研究報(bào)告
評(píng)論
0/150
提交評(píng)論