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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論