深入理解JAVA核心:揭秘反射機(jī)制的奧秘
1為什么需要反射?(reflect)
Person p = new Student();
p在編譯時(shí)的類型是person,但是在運(yùn)行時(shí)是student。
為了讓程序在運(yùn)行時(shí)發(fā)現(xiàn)對(duì)象和類的真實(shí)信息,有兩種做法:
- 1,假設(shè)我們知道類的具體信息,可以通過instanceof 運(yùn)算符進(jìn)行判斷。
- 2,在編譯的時(shí)候不知道對(duì)象和類的信息,可以通過反射獲取。
三種獲取class對(duì)象的方法。
//獲取Class對(duì)象第一種class.forName/
try {
Class clazz1 = Class.forName(“com.aaa.entity.Person”);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//獲取Class對(duì)象第二種.class Class clazz2 = Person.class;
//獲取Class對(duì)象第三種getClass() /* Person p = new Person(); Class class3 = p.getClass();*/
getName() :以 String 的形式返回此 Class 對(duì)象所表示的實(shí)體(類、接口、數(shù)組類、基本類型或 void)名稱。
getSimpleName() :返回源代碼中給出的基礎(chǔ)類的簡(jiǎn)稱。
newInstance() :創(chuàng)建此 Class 對(duì)象所表示的類的一個(gè)新實(shí)例。
forName(String className) :返回與帶有給定字符串名的類或接口相關(guān)聯(lián)的 Class 對(duì)象
使用反射獲取構(gòu)造器
//獲取構(gòu)造器
Constructor[] cons = s.getClass().getConstructors();
for (Constructor constructor : cons) {
System.out.println(constructor);
}使用反射獲取公共方法,注意不包括構(gòu)造方法,但是包括Object中的方法
Method[] methods = clazz2.getMethods();
System.out.println(methods.length);
for (Method method : methods) {
System.out.println(method.getName());
}使用反射獲取所有包括私有方法,注意不包括構(gòu)造方法,但是不包括Object中的(繼承的)方法
/*Method[] methods2 = clazz2.getDeclaredMethods();
System.out.println(methods2.length);
for (Method method : methods2) {
System.out.println(method.getName());
}*/
使用反射獲取屬性,getFields只能獲取公共屬性
Field[] fields = clazz2.getFields();
System.out.println(fields.length);如果想獲取所有的,使用getDeclaredFields()
Field[] fields = clazz2.getDeclaredFields();
System.out.println(fields.length);設(shè)置對(duì)象屬性
Student student = new Student();
Field field = student.getClass().getDeclaredField("name");
//field.setAccessible(true);
field.set(student, "張三");
System.out.println(student.getName());2創(chuàng)建持久層框架
/**
* 通用方法獲取對(duì)象集合
*/
public static List selectObjList(String sql,Object[] params,Class clazz) throws Exception{
List list = new ArrayList();
con = getConnection();
try {
ps = con.prepareStatement(sql);
setParams(params);
rs = ps.executeQuery();
//列數(shù)
ResultSetMetaData rsm = rs.getMetaData();
int count = rsm.getColumnCount();//獲取列數(shù)
while(rs.next()){
Object obj = clazz.newInstance();//實(shí)例化一個(gè)對(duì)象
for(int i=1;i<=count;i++){
String key = rsm.getColumnName(i);//獲取列名
Object value = rs.getObject(i);//獲取對(duì)應(yīng)列的值
Field field = clazz.getDeclaredField(key);//獲取對(duì)象的成員變量(字段名)
field.setAccessible(true);//設(shè)置可訪問
if(value!=null){
field.set(obj, value);
}
}
list.add(obj);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
closeAll();
}
return list;
}到此這篇關(guān)于深入理解JAVA核心:揭秘反射機(jī)制的奧秘的文章就介紹到這了,更多相關(guān)JAVA反射機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot啟動(dòng)流程SpringApplication準(zhǔn)備階段源碼分析
這篇文章主要為大家介紹了SpringBoot啟動(dòng)流程SpringApplication準(zhǔn)備階段源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
基于SpringBoot + MyBatis-Plus高效實(shí)現(xiàn)數(shù)據(jù)變更記錄
在應(yīng)用開發(fā)過程中,在某些情況下,需要實(shí)現(xiàn)數(shù)據(jù)的變更記錄,以便于在未來進(jìn)行數(shù)據(jù)操作變更的回溯,那有什么辦法高效實(shí)現(xiàn)數(shù)據(jù)操作變更記錄,而不需要一個(gè)一個(gè)地方去加呢?答案當(dāng)然是有,今天小編就給大家介紹下如何基于SpringBoot + MyBatis-Plus高效實(shí)現(xiàn)數(shù)據(jù)的變更記錄,2026-02-02
Java獲取當(dāng)前操作系統(tǒng)的信息實(shí)例代碼
這篇文章主要介紹了Java獲取當(dāng)前操作系統(tǒng)的信息實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
Logger.error打印錯(cuò)誤異常的詳細(xì)堆棧信息
這篇文章主要介紹了Logger.error打印錯(cuò)誤異常的詳細(xì)堆棧信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
java 查詢oracle數(shù)據(jù)庫所有表DatabaseMetaData的用法(詳解)
下面小編就為大家?guī)硪黄猨ava 查詢oracle數(shù)據(jù)庫所有表DatabaseMetaData的用法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
Java基于循環(huán)遞歸回溯實(shí)現(xiàn)八皇后問題算法示例
這篇文章主要介紹了Java基于循環(huán)遞歸回溯實(shí)現(xiàn)八皇后問題算法,結(jié)合具體實(shí)例形式分析了java的遍歷、遞歸、回溯等算法實(shí)現(xiàn)八皇后問題的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
springboot+maven快速構(gòu)建項(xiàng)目的示例代碼
本篇文章主要介紹了springboot+maven快速構(gòu)建項(xiàng)目的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08

