版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——Java反射機(jī)制學(xué)習(xí)總結(jié)Java反射機(jī)制學(xué)習(xí)總結(jié)
一、什么是反射機(jī)制
簡樸的來說,反射機(jī)制指的是程序在運(yùn)行時(shí)能夠獲取自身的信息。在java中,只要給定類的名字,那么就可以通過反射機(jī)制來獲得類的全體信息。
二、哪里用到反射機(jī)制
有些時(shí)候,我們用過一些學(xué)識,但是并不知道它的專業(yè)術(shù)語是什么,在剛剛學(xué)jdbc時(shí)用過一行代碼,Class.forNamecom.mysql.jdbc.Driver.class.newInstance;但是那時(shí)候只知道那行代碼是生成驅(qū)動(dòng)對象實(shí)例,并不知道它的概括含義。聽了反射機(jī)制這節(jié)課后,才知道,原來這就是反射,現(xiàn)在好多開框架都用到反射機(jī)制,hibernate、struts都是用反射機(jī)制實(shí)現(xiàn)的。
三、反射機(jī)制的優(yōu)點(diǎn)與缺點(diǎn)
為什么要用反射機(jī)制?直接創(chuàng)造對象不就可以了嗎,這就涉及到了動(dòng)態(tài)與靜態(tài)的概念,
靜態(tài)編譯:在編譯時(shí)確定類型,綁定對象,即通過。
動(dòng)態(tài)編譯:運(yùn)行時(shí)確定類型,綁定對象。動(dòng)態(tài)編譯最大限度發(fā)揮了java的生動(dòng)性,表達(dá)了多態(tài)的應(yīng)用,有以降低類之間的藕合性。
一句話,反射機(jī)制的優(yōu)點(diǎn)就是可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)造對象和編譯,表達(dá)出很大的生動(dòng)性,更加是在J2EE的開發(fā)中它的生動(dòng)性就表現(xiàn)的特別明顯。譬如,一個(gè)大型的軟件,不成能一次就把把它設(shè)計(jì)的很完備,當(dāng)這個(gè)程序編譯后,發(fā)布了,當(dāng)察覺需要更新某些功能時(shí),我們不成能要用戶把以前的卸載,再重新安裝新的版本,假使這樣的話,這個(gè)軟件斷定是沒有多少人用的。采用靜態(tài)的話,需要把整個(gè)程序重新編譯一次才可以實(shí)現(xiàn)功能的更新,而采用反射機(jī)制的話,它就可以不用卸載,只需要在運(yùn)行時(shí)才動(dòng)態(tài)的創(chuàng)造和編譯,就可以實(shí)現(xiàn)該功能。
它的缺點(diǎn)是對性能有影響。使用反射根本上是一種解釋操作,我們可以報(bào)告JVM,我們夢想做什么并且它得志我們的要求。這類操作總是慢于只直接執(zhí)行一致的操作。
四、利用反射機(jī)制能獲得什么信息
一句話,類中有什么信息,它就可以獲得什么信息,不過前提是得知道類的名字,要不就沒有后文了首先得根據(jù)傳入的類的全名來創(chuàng)造Class對象。
Classc=Class.forNameclassName;注明:className務(wù)必為全名,也就是得包含包名,譬如,java.pojo.UserInfo;
Objectobj=c.newInstance;//創(chuàng)造對象的實(shí)例
OK,有了對象就什么都好辦了,想要什么信息就有什么信息了。
獲得構(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)造器
獲得類方法的方法
MethodgetMethodStringname,Class[]params,根據(jù)方法名,參數(shù)類型獲得方法
Method[]getMethods//獲得全體的public方法
MethodgetDeclaredMethodStringname,Class[]params//根據(jù)方法名和參數(shù)類型,獲得public和非public的方法
Method[]getDeclaredMethods//獲得所以的public和非public方法
獲得類中屬性的方法
FieldgetFieldStringname//根據(jù)變量名得到相應(yīng)的public變量
Field[]getFields//獲得類中所以public的方法
FieldgetDeclaredFieldStringname//根據(jù)方法名獲得public和非public變量
Field[]getDeclaredFields//獲得類中全體的public和非public方法
常用的就這些,知道這些,其他的都好辦……
五、用反射機(jī)制能干什么事
剛開頭在使用jdbc時(shí)侯,在編寫訪問數(shù)據(jù)庫時(shí)寫到想吐,有八個(gè)表,每個(gè)表都有增刪改查中操作,那時(shí)候還不知道有反射機(jī)制這個(gè)概念,所以就對不同的表創(chuàng)造不同的dao類,這樣不僅開發(fā)速率地,而且代碼冗余的厲害,最要命的是看著差不多的,然后直接復(fù)制修改,由于輕易犯各種低級的錯(cuò)誤(大小寫啊,多一個(gè)或少一個(gè)字母啊……),一個(gè)錯(cuò)誤就可以讓你找半天。
有了java反射機(jī)制,什么都好辦了,只需要寫一個(gè)dao類,四個(gè)方法,增刪改查,傳入不同的對象,就OK啦,無需為每一個(gè)表都創(chuàng)造dao類,反射機(jī)制會(huì)自動(dòng)幫我們完成剩下的事情,這就是它的好處。說白了,反射機(jī)制就是特意幫我們做那些重復(fù)的有規(guī)矩的事情,所以現(xiàn)在好多的自動(dòng)生成代碼的軟件就是運(yùn)用反射機(jī)制來完成的,只要你按照規(guī)矩輸入相關(guān)的參數(shù),所以低級的程序員逐漸的就被抹殺了,為什么?由于代碼都不用寫了,隨意一個(gè)人都會(huì)開發(fā),還要程序員干什么???所以我們只有一條出路,那就是努力努力再努力,成為高級程序員,特意開發(fā)傻瓜軟件,讓其他程序員到一邊涼快去,呵呵~
六、用反射機(jī)制實(shí)現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)的增、查例子
根本原理;保存數(shù)據(jù)時(shí),把需要保存的對象的屬性值全部取出來再拼湊sql語句查詢時(shí),將查詢到的數(shù)據(jù)全部包裝成一個(gè)java對象。
嬉戲規(guī)矩:俗話說的好,無法則不成方圓,更加是程序來說,它只能做有規(guī)矩的事情,沒有規(guī)矩的它干不了,好,那就先定規(guī)矩
1)數(shù)據(jù)庫的每一個(gè)表對象一個(gè)pojo類,表中的每一個(gè)字段對應(yīng)pojo類的.中的一個(gè)屬性。并且pojo類的名字和表的名字一致,屬性名和字段名一致,大小寫沒有關(guān)系,由于數(shù)據(jù)庫一般不區(qū)分大小寫
2)為pojo類中的每一個(gè)屬性添加標(biāo)準(zhǔn)的set和get方法。
有了嬉戲規(guī)矩,那么開頭嬉戲吧。
1、首先數(shù)據(jù)庫的有一個(gè)表,假設(shè)數(shù)據(jù)庫名稱為:blogsystem,里面的一個(gè)表名userinfo。如圖:
2、創(chuàng)造對應(yīng)的pojo類:
復(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、編寫獲得數(shù)據(jù)庫連接的工廠類:
復(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、好戲開頭啦,編寫操作數(shù)據(jù)庫的dao類
復(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
/**
*解析出保存對象的sql語句
*
*@paramobject
*:需要保存的對象
*@return:保存對象的sql語句
*/
publicstaticStringgetSaveObjectSqlObjectobject
//定義一個(gè)sql字符串
Stringsql=into;
//得到對象的類
Classc=object.getClass;
//得到對象中全體的方法
Method[]methods=c.getMethods;
//得到對象中全體的屬性
Field[]fields=c.getFields;
//得到對象類的名字
StringcName=c.getName;
//從類的名字中解析出表名
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;
/**
*將對象保存到數(shù)據(jù)庫中
*
*@paramobject
*:需要保存的對象
*@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ù)庫中取得對象
*
*@paramarg0
*:對象所屬的類
*@paramid
*:對象的id
*@return:需要查找的對象
*/
publicObjectgetObjectStringclassName,intId
//得到表名字
StringtableName=className.substringclassName.lastIndexOf.+1,
className.length;
//根據(jù)類名來創(chuàng)造Class對象
Classc=null;
try
c=Class.forNameclassName;
catchClassNotFoundExceptione1
e1.printStackTrace;
//拼湊查詢sql語句
Stringsql=select*from+tableName+whereId=+Id;
System.out.println查找sql語句:+sql;
//獲得數(shù)據(jù)庫鏈接
Connectioncon=Connect2DBFactory.getDBConnection;
//創(chuàng)造類的實(shí)例
Objectobj=null;
try
Statementstm=con.createStatement;
//得到執(zhí)行查尋語句返回的結(jié)果集
ResultSetset=stm.executeQuerysql;
//得到對象的方法數(shù)組
Method[]methods=c.getMethods;
//遍歷結(jié)果集
whileset.next
obj=c.newInstance;
//遍歷對象的方法
forMethodmethod:methods
StringmethodName=method.getName;
//假設(shè)對象的方法以set開頭
ifmethodName.startsWithset
//根據(jù)方法名字得到數(shù)據(jù)表格中字段的名字
StringcolumnName=methodName.substring3,
methodName.length;
//得到方法的參數(shù)類型
Class[]parmts=method.getParameterTypes;
ifparmts[0]==String.class
//假設(shè)參數(shù)為String類型,那么從結(jié)果集中按照列名取得對應(yīng)的值,并且執(zhí)行改set方法
method.invokeobj,set.getStringcolumnName;
ifparmts[0]==int.class
method.invokeobj,set.getIntcolumnName;
catchExceptione
e.printStackTrace;
returnobj;
4、開頭測試效果怎么樣:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版建筑材料知識產(chǎn)權(quán)保護(hù)銷售合同樣本3篇
- 二零二五年度車場租賃與停車場環(huán)境美化合同4篇
- 教育領(lǐng)域的時(shí)間管理研究進(jìn)展與展望
- 家庭教育環(huán)境的智能化改造方案
- 二零二五年度草原生態(tài)修復(fù)與種植合作合同3篇
- 2025版施工安全責(zé)任免除協(xié)議書(全新升級)3篇
- 甘肅2025年甘肅民族師范學(xué)院招聘博士研究生59人筆試歷年參考題庫附帶答案詳解
- 二零二五年度新能源高速公路車輛通行費(fèi)結(jié)算合同2篇
- 網(wǎng)絡(luò)世界安全為先家庭教育的必修課
- 2025年度農(nóng)業(yè)綜合開發(fā)項(xiàng)目土地承包種植合同4篇
- 《哪吒之魔童降世》中的哪吒形象分析
- 信息化運(yùn)維服務(wù)信息化運(yùn)維方案
- 汽車修理廠員工守則
- 骨科手術(shù)的術(shù)后飲食和營養(yǎng)指導(dǎo)
- 六年級上冊數(shù)學(xué)應(yīng)用題100題
- 個(gè)人代賣協(xié)議
- 公安交通管理行政處罰決定書式樣
- 10.《運(yùn)動(dòng)技能學(xué)習(xí)與控制》李強(qiáng)
- 冀教版數(shù)學(xué)七年級下冊綜合訓(xùn)練100題含答案
- 1神經(jīng)外科分級護(hù)理制度
- 場館惡劣天氣處置應(yīng)急預(yù)案
評論
0/150
提交評論