Java反射機(jī)制學(xué)習(xí)總結(jié)_第1頁(yè)
Java反射機(jī)制學(xué)習(xí)總結(jié)_第2頁(yè)
Java反射機(jī)制學(xué)習(xí)總結(jié)_第3頁(yè)
Java反射機(jī)制學(xué)習(xí)總結(jié)_第4頁(yè)
Java反射機(jī)制學(xué)習(xí)總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論