Java反射概念與使用實例代碼
前言
大家好,瑞雪后的第一天,每個周一的大家都期待這周五的來臨。相信很多小伙伴上周末就兩件事,賞雪和看EDG。哈哈 開始正題吧,今天聊一聊反射吧,在java中經(jīng)常使用。
反射
相信剛接觸Java的,第一句肯定會問什么是反射呢?反射有什么作用呢?為什么使用反射呢?首先反射是Java的特征之一,項目中Java程序在運行的過程中,自動去識別并創(chuàng)建對應的類,能夠動態(tài)的調(diào)用類的屬性、構(gòu)造方法、類中的方法。一句話描述:在程序中能動態(tài)調(diào)用不同的類和屬性,去執(zhí)行特定的操作。
正因為反射能夠在運行時動態(tài)加載需要的對象,所以很多框架中都使用到了反射。本次為了大家很好的理解反射,將基于反射創(chuàng)建對象、獲取反射中的對象、獲取類中屬性、獲取類中的構(gòu)造方法、獲取類中方法幾個方面進行介紹,下面開始進入正題。
基礎數(shù)據(jù)準備
為了方便演示,創(chuàng)建了一個基礎的對象類。并基于他進行本次的介紹。創(chuàng)建的演示類JueJinUser如下,包含四個屬性,分別有g(shù)et和set方法,還有toString方法,沒有創(chuàng)建構(gòu)造方法,下面會介紹通過反射自動創(chuàng)建的相關反射的方法。
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)建對象
基于反射創(chuàng)建類對象主要有兩種方式:第一種是通過類對象的newInstance()方法創(chuàng)建對象,第二種是通過構(gòu)造器中的 newInstance()方法創(chuàng)建對象。
類對象的newInstance()方法
類對象的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)建方式中第一種基于類對象的newInstance()的方法只能是無參構(gòu)造方法,而第二種基于構(gòu)造器的 newInstance()方法可以有有參構(gòu)造方法和無參構(gòu)造方法,比較靈活。
獲取反射中的對象
獲取反射對象的方式有三種,分別是:Class.forName、.class 方法和getClass() 方法。獲取反射中對象的方法大家在項目中使用的還是比較多的,相信大家都不陌生。
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();
獲取類中屬性
通過getFields和getDeclaredFields的方法,可以獲取類中的屬性信息,其中g(shù)etFields可以獲取類中的公有屬性值,而getDeclaredFields的方法,獲取所有類中的屬性信息,但是無法獲取到父類的信息。格式如下:
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 ---");
獲取類中的構(gòu)造方法
通過getConstructors和getDeclaredConstructors的方法,可以獲取類中的構(gòu)造方法信息,其中g(shù)etConstructors可以獲取類中構(gòu)造方法,而getDeclaredConstructors的方法,獲取所有類中的構(gòu)造方法,但是無法獲取到父類的構(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---");
獲取類中方法
通過getMethods和getDeclaredMethods的方法,可以獲取類中的構(gòu)造方法信息,其中g(shù)etMethods可以獲取類中構(gòu)造方法,而getDeclaredMethods的方法,獲取所有類中的方法,但是無法獲取到父類的方法信息。格式如下:
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é)語
到此這篇關于Java反射概念與使用的文章就介紹到這了,更多相關Java反射概念與使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java多線程之readwritelock讀寫分離的實現(xiàn)代碼
這篇文章主要介紹了Java多線程之readwritelock讀寫分離的相關內(nèi)容,文中涉及具體實例代碼,具有一定參考價值,需要的朋友可以了解下。2017-10-10
java.net.ConnectException異常的正確解決方法(親測有效!)
java.net.ConnectException異常是與網(wǎng)絡相關的最常見的Java異常之一,建立從客戶端應用程序到服務器的TCP連接時,我們可能會遇到它,這篇文章主要給大家介紹了關于java.net.ConnectException異常的正確解決方法,需要的朋友可以參考下2024-01-01
Spring Data JPA帶條件分頁查詢實現(xiàn)原理
這篇文章主要介紹了Spring Data JPA帶條件分頁查詢實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05

