Java反射概念與使用實(shí)例代碼
前言
大家好,瑞雪后的第一天,每個(gè)周一的大家都期待這周五的來(lái)臨。相信很多小伙伴上周末就兩件事,賞雪和看EDG。哈哈 開(kāi)始正題吧,今天聊一聊反射吧,在java中經(jīng)常使用。
反射
相信剛接觸Java的,第一句肯定會(huì)問(wèn)什么是反射呢?反射有什么作用呢?為什么使用反射呢?首先反射是Java的特征之一,項(xiàng)目中Java程序在運(yùn)行的過(guò)程中,自動(dòng)去識(shí)別并創(chuàng)建對(duì)應(yīng)的類(lèi),能夠動(dòng)態(tài)的調(diào)用類(lèi)的屬性、構(gòu)造方法、類(lèi)中的方法。一句話描述:在程序中能動(dòng)態(tài)調(diào)用不同的類(lèi)和屬性,去執(zhí)行特定的操作。
正因?yàn)榉瓷淠軌蛟谶\(yùn)行時(shí)動(dòng)態(tài)加載需要的對(duì)象,所以很多框架中都使用到了反射。本次為了大家很好的理解反射,將基于反射創(chuàng)建對(duì)象、獲取反射中的對(duì)象、獲取類(lèi)中屬性、獲取類(lèi)中的構(gòu)造方法、獲取類(lèi)中方法幾個(gè)方面進(jìn)行介紹,下面開(kāi)始進(jìn)入正題。
基礎(chǔ)數(shù)據(jù)準(zhǔn)備
為了方便演示,創(chuàng)建了一個(gè)基礎(chǔ)的對(duì)象類(lèi)。并基于他進(jìn)行本次的介紹。創(chuàng)建的演示類(lèi)JueJinUser如下,包含四個(gè)屬性,分別有g(shù)et和set方法,還有toString方法,沒(méi)有創(chuàng)建構(gòu)造方法,下面會(huì)介紹通過(guò)反射自動(dòng)創(chuàng)建的相關(guān)反射的方法。
public class JueJinUser { private Integer id; private String name; private String title; private Integer age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "JueJinUser{" + "id=" + id + ", name='" + name + '\'' + ", title='" + title + '\'' + ", age=" + age + '}'; } }
基于反射創(chuàng)建對(duì)象
基于反射創(chuàng)建類(lèi)對(duì)象主要有兩種方式:第一種是通過(guò)類(lèi)對(duì)象的newInstance()方法創(chuàng)建對(duì)象,第二種是通過(guò)構(gòu)造器中的 newInstance()方法創(chuàng)建對(duì)象。
類(lèi)對(duì)象的newInstance()方法
類(lèi)對(duì)象的newInstance()方法創(chuàng)建方法如下:
Class class = JueJinUser.class; JueJinUser jueJinUseByClass = (JueJinUser) class.newInstance();
構(gòu)造器的newInstance()方法
Class jueJinUserClass = JueJinUser.class; Constructor constructor = jueJinUserClass.getConstructor(); JueJinUser jueJinUserByConstructor = (JueJinUser) constructor.newInstance();
需要注意的是,兩種創(chuàng)建方式中第一種基于類(lèi)對(duì)象的newInstance()的方法只能是無(wú)參構(gòu)造方法,而第二種基于構(gòu)造器的 newInstance()方法可以有有參構(gòu)造方法和無(wú)參構(gòu)造方法,比較靈活。
獲取反射中的對(duì)象
獲取反射對(duì)象的方式有三種,分別是:Class.forName、.class 方法和getClass() 方法。獲取反射中對(duì)象的方法大家在項(xiàng)目中使用的還是比較多的,相信大家都不陌生。
Class.forName
Class clzForName = Class.forName("com.example.demo.module.JueJinUser");
.class 方法
Class clzForClass =JueJinUserString.class;
getClass() 方法
JueJinUser JueJinUser = new JueJinUser(); Class clzNewObject = str.getClass();
獲取類(lèi)中屬性
通過(guò)getFields和getDeclaredFields的方法,可以獲取類(lèi)中的屬性信息,其中g(shù)etFields可以獲取類(lèi)中的公有屬性值,而getDeclaredFields的方法,獲取所有類(lèi)中的屬性信息,但是無(wú)法獲取到父類(lèi)的信息。格式如下:
Class clz = JueJinUser.class; Field[] fields = clz.getFields(); System.out.println("--- getFields start ---"); for (Field field : fields) { System.out.println(field.getName()); } System.out.println("--- getFields end ---"); System.out.println("--- getDeclaredFields start ---"); Field[] declaredFields = clz.getDeclaredFields(); for (Field field : declaredFields) { System.out.println(field.getName()); } System.out.println("--- etDeclaredFields end ---");
獲取類(lèi)中的構(gòu)造方法
通過(guò)getConstructors和getDeclaredConstructors的方法,可以獲取類(lèi)中的構(gòu)造方法信息,其中g(shù)etConstructors可以獲取類(lèi)中構(gòu)造方法,而getDeclaredConstructors的方法,獲取所有類(lèi)中的構(gòu)造方法,但是無(wú)法獲取到父類(lèi)的構(gòu)造方法信息。格式如下:
System.out.println("--- getConstructors start ---"); Constructor[] constructors = clz.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor.getName()); } System.out.println("--- getConstructors end ---"); System.out.println("---getDeclaredConstructors start---"); Constructor[] declaredConstructors = clz.getDeclaredConstructors(); for (Constructor constructor : declaredConstructors) { System.out.println(constructor.getName()); } System.out.println("---getDeclaredConstructors end---");
獲取類(lèi)中方法
通過(guò)getMethods和getDeclaredMethods的方法,可以獲取類(lèi)中的構(gòu)造方法信息,其中g(shù)etMethods可以獲取類(lèi)中構(gòu)造方法,而getDeclaredMethods的方法,獲取所有類(lèi)中的方法,但是無(wú)法獲取到父類(lèi)的方法信息。格式如下:
System.out.println("--- getMethods start ---"); Method[] methods = clz.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } System.out.println("--- getMethods end ---"); System.out.println("--- getDeclaredMethods start---"); Method[] declaredMethods = clz.getDeclaredMethods(); for (Method method : declaredMethods) { System.out.println(method.getName()); } System.out.println("--- getDeclaredMethods end ---");
結(jié)語(yǔ)
到此這篇關(guān)于Java反射概念與使用的文章就介紹到這了,更多相關(guān)Java反射概念與使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
完全解析Java編程中finally語(yǔ)句的執(zhí)行原理
這篇文章主要深度介紹了Java編程中finally語(yǔ)句的執(zhí)行原理,細(xì)致講解了finally在異常處理中的流程控制作用,需要的朋友可以參考下2015-11-11深入了解Java語(yǔ)言中的并發(fā)性選項(xiàng)有何不同
這篇文章主要介紹了深入了解Java語(yǔ)言中的并發(fā)性選項(xiàng)有何不同,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06spring mvc4的日期/數(shù)字格式化、枚舉轉(zhuǎn)換示例
本篇文章主要介紹了spring mvc4的日期/數(shù)字格式化、枚舉轉(zhuǎn)換示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01PageHelper插件實(shí)現(xiàn)一對(duì)多查詢時(shí)的分頁(yè)問(wèn)題
這篇文章主要介紹了PageHelper插件實(shí)現(xiàn)一對(duì)多查詢時(shí)的分頁(yè)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java實(shí)現(xiàn)五子棋的基礎(chǔ)方法
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)五子棋的基礎(chǔ)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09關(guān)于apollo和Spring集成@Value注解通用解析
這篇文章主要介紹了關(guān)于apollo和Spring集成@Value注解通用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11解決springmvc項(xiàng)目中使用過(guò)濾器來(lái)解決請(qǐng)求方式為post時(shí)出現(xiàn)亂碼的問(wèn)題
這篇文章主要介紹了springmvc項(xiàng)目中使用過(guò)濾器來(lái)解決請(qǐng)求方式為post時(shí)出現(xiàn)亂碼的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08