深入理解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)文章
Spring boot @ModelAttribute標(biāo)注的實(shí)現(xiàn)
這篇文章主要介紹了Spring boot @ModelAttribute標(biāo)注的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01只需兩步實(shí)現(xiàn)Eclipse+Maven快速構(gòu)建第一個(gè)Spring Boot項(xiàng)目
這篇文章主要介紹了只需兩步實(shí)現(xiàn)Eclipse+Maven快速構(gòu)建第一個(gè)Spring Boot項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12Spring整合Quartz定時(shí)任務(wù)并在集群、分布式系統(tǒng)中的應(yīng)用
這篇文章主要介紹了Spring整合Quartz定時(shí)任務(wù)并在集群、分布式系統(tǒng)中的應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04springmvc+shiro自定義過濾器的實(shí)現(xiàn)代碼
這篇文章主要介紹了springmvc+shiro自定義過濾器的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10org.springframework.dao.OptimisticLockingFailureException樂觀鎖
本文主要介紹了org.springframework.dao.OptimisticLockingFailureException樂觀鎖失敗的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05淺談MyBatis-Plus學(xué)習(xí)之Oracle的主鍵Sequence設(shè)置的方法
這篇文章主要介紹了淺談MyBatis-Plus學(xué)習(xí)之Oracle的主鍵Sequence設(shè)置的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08SpringBoot基于Mybatis攔截器和JSqlParser實(shí)現(xiàn)數(shù)據(jù)隔離
本文將介紹如何在 Spring Boot 項(xiàng)目中利用Mybatis的強(qiáng)大攔截器機(jī)制結(jié)合JSqlParser,一個(gè)功能豐富的 SQL 解析器,來輕松實(shí)現(xiàn)數(shù)據(jù)隔離的目標(biāo),本文根據(jù)示例展示如何根據(jù)當(dāng)前的運(yùn)行環(huán)境來實(shí)現(xiàn)數(shù)據(jù)隔離,需要的朋友可以參考下2024-04-04淺談springboot多模塊(modules)開發(fā)
這篇文章主要介紹了淺談springboot多模塊(modules)開發(fā),詳細(xì)的介紹了springboot多模塊的實(shí)現(xiàn),有興趣的可以了解一下2017-09-09