版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——Java反射機制學(xué)習(xí)總結(jié)Java反射機制學(xué)習(xí)總結(jié)
一、什么是反射機制
簡樸的來說,反射機制指的是程序在運行時能夠獲取自身的信息。在java中,只要給定類的名字,那么就可以通過反射機制來獲得類的全體信息。
二、哪里用到反射機制
有些時候,我們用過一些學(xué)識,但是并不知道它的專業(yè)術(shù)語是什么,在剛剛學(xué)jdbc時用過一行代碼,Class.forNamecom.mysql.jdbc.Driver.class.newInstance;但是那時候只知道那行代碼是生成驅(qū)動對象實例,并不知道它的概括含義。聽了反射機制這節(jié)課后,才知道,原來這就是反射,現(xiàn)在好多開框架都用到反射機制,hibernate、struts都是用反射機制實現(xiàn)的。
三、反射機制的優(yōu)點與缺點
為什么要用反射機制?直接創(chuàng)造對象不就可以了嗎,這就涉及到了動態(tài)與靜態(tài)的概念,
靜態(tài)編譯:在編譯時確定類型,綁定對象,即通過。
動態(tài)編譯:運行時確定類型,綁定對象。動態(tài)編譯最大限度發(fā)揮了java的生動性,表達了多態(tài)的應(yīng)用,有以降低類之間的藕合性。
一句話,反射機制的優(yōu)點就是可以實現(xiàn)動態(tài)創(chuàng)造對象和編譯,表達出很大的生動性,更加是在J2EE的開發(fā)中它的生動性就表現(xiàn)的特別明顯。譬如,一個大型的軟件,不成能一次就把把它設(shè)計的很完備,當(dāng)這個程序編譯后,發(fā)布了,當(dāng)察覺需要更新某些功能時,我們不成能要用戶把以前的卸載,再重新安裝新的版本,假使這樣的話,這個軟件斷定是沒有多少人用的。采用靜態(tài)的話,需要把整個程序重新編譯一次才可以實現(xiàn)功能的更新,而采用反射機制的話,它就可以不用卸載,只需要在運行時才動態(tài)的創(chuàng)造和編譯,就可以實現(xiàn)該功能。
它的缺點是對性能有影響。使用反射根本上是一種解釋操作,我們可以報告JVM,我們夢想做什么并且它得志我們的要求。這類操作總是慢于只直接執(zhí)行一致的操作。
四、利用反射機制能獲得什么信息
一句話,類中有什么信息,它就可以獲得什么信息,不過前提是得知道類的名字,要不就沒有后文了首先得根據(jù)傳入的類的全名來創(chuàng)造Class對象。
Classc=Class.forNameclassName;注明:className務(wù)必為全名,也就是得包含包名,譬如,java.pojo.UserInfo;
Objectobj=c.newInstance;//創(chuàng)造對象的實例
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方法
常用的就這些,知道這些,其他的都好辦……
五、用反射機制能干什么事
剛開頭在使用jdbc時侯,在編寫訪問數(shù)據(jù)庫時寫到想吐,有八個表,每個表都有增刪改查中操作,那時候還不知道有反射機制這個概念,所以就對不同的表創(chuàng)造不同的dao類,這樣不僅開發(fā)速率地,而且代碼冗余的厲害,最要命的是看著差不多的,然后直接復(fù)制修改,由于輕易犯各種低級的錯誤(大小寫啊,多一個或少一個字母啊……),一個錯誤就可以讓你找半天。
有了java反射機制,什么都好辦了,只需要寫一個dao類,四個方法,增刪改查,傳入不同的對象,就OK啦,無需為每一個表都創(chuàng)造dao類,反射機制會自動幫我們完成剩下的事情,這就是它的好處。說白了,反射機制就是特意幫我們做那些重復(fù)的有規(guī)矩的事情,所以現(xiàn)在好多的自動生成代碼的軟件就是運用反射機制來完成的,只要你按照規(guī)矩輸入相關(guān)的參數(shù),所以低級的程序員逐漸的就被抹殺了,為什么?由于代碼都不用寫了,隨意一個人都會開發(fā),還要程序員干什么啊?所以我們只有一條出路,那就是努力努力再努力,成為高級程序員,特意開發(fā)傻瓜軟件,讓其他程序員到一邊涼快去,呵呵~
六、用反射機制實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)的增、查例子
根本原理;保存數(shù)據(jù)時,把需要保存的對象的屬性值全部取出來再拼湊sql語句查詢時,將查詢到的數(shù)據(jù)全部包裝成一個java對象。
嬉戲規(guī)矩:俗話說的好,無法則不成方圓,更加是程序來說,它只能做有規(guī)矩的事情,沒有規(guī)矩的它干不了,好,那就先定規(guī)矩
1)數(shù)據(jù)庫的每一個表對象一個pojo類,表中的每一個字段對應(yīng)pojo類的.中的一個屬性。并且pojo類的名字和表的名字一致,屬性名和字段名一致,大小寫沒有關(guān)系,由于數(shù)據(jù)庫一般不區(qū)分大小寫
2)為pojo類中的每一個屬性添加標準的set和get方法。
有了嬉戲規(guī)矩,那么開頭嬉戲吧。
1、首先數(shù)據(jù)庫的有一個表,假設(shè)數(shù)據(jù)庫名稱為:blogsystem,里面的一個表名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
//定義一個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)造類的實例
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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版工程機械設(shè)備租賃與技術(shù)創(chuàng)新服務(wù)合同3篇
- 二零二五版護林員勞動合同書編制指南3篇
- 二零二五版按揭購房合同:智能家居系統(tǒng)智能家居系統(tǒng)節(jié)能改造合同3篇
- 二零二五年度游戲公司代運營及運營支持合同3篇
- 二零二五版包雪服務(wù)項目風(fēng)險評估與預(yù)案合同3篇
- 二零二五年度餐飲配送企業(yè)食品安全責(zé)任追究合同3篇
- 二零二五版海洋工程高低壓配電系統(tǒng)安裝合同2篇
- 二零二五版小微企業(yè)貸款合同與信用增級服務(wù)協(xié)議3篇
- 二零二五年度海洋工程設(shè)備采購合同15篇
- 二零二五年黃豆種植戶風(fēng)險管理采購合同3篇
- MT/T 199-1996煤礦用液壓鉆車通用技術(shù)條件
- GB/T 6144-1985合成切削液
- GB/T 10357.1-2013家具力學(xué)性能試驗第1部分:桌類強度和耐久性
- 第三方在線糾紛解決機制(ODR)述評,國際商法論文
- 公寓de全人物攻略本為個人愛好而制成如需轉(zhuǎn)載注明信息
- 第5章-群體-團隊溝通-管理溝通
- 腎臟病飲食依從行為量表(RABQ)附有答案
- 深基坑-安全教育課件
- 園林施工管理大型園林集團南部區(qū)域養(yǎng)護標準圖例
- 排水許可申請表
- 低血糖的觀察和護理課件
評論
0/150
提交評論