您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Java反射如何使用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
相信剛接觸Java的,第一句肯定會問什么是反射呢?反射有什么作用呢?為什么使用反射呢?首先反射是Java的特征之一,項目中Java程序在運行的過程中,自動去識別并創建對應的類,能夠動態的調用類的屬性、構造方法、類中的方法。一句話描述:在程序中能動態調用不同的類和屬性,去執行特定的操作。
正因為反射能夠在運行時動態加載需要的對象,所以很多框架中都使用到了反射。本次為了大家很好的理解反射,將基于反射創建對象、獲取反射中的對象、獲取類中屬性、獲取類中的構造方法、獲取類中方法幾個方面進行介紹,下面開始進入正題。
為了方便演示,創建了一個基礎的對象類。并基于他進行本次的介紹。創建的演示類JueJinUser如下,包含四個屬性,分別有get和set方法,還有toString方法,沒有創建構造方法,下面會介紹通過反射自動創建的相關反射的方法。
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 + '}'; } }
基于反射創建類對象主要有兩種方式:第一種是通過類對象的newInstance()方法創建對象,第二種是通過構造器中的 newInstance()方法創建對象。
類對象的newInstance()方法
??類對象的newInstance()方法創建方法如下:
Class class = JueJinUser.class; JueJinUser jueJinUseByClass = (JueJinUser) class.newInstance();
構造器的newInstance()方法
Class jueJinUserClass = JueJinUser.class; Constructor constructor = jueJinUserClass.getConstructor(); JueJinUser jueJinUserByConstructor = (JueJinUser) constructor.newInstance();
需要注意的是,兩種創建方式中第一種基于類對象的newInstance()的方法只能是無參構造方法,而第二種基于構造器的 newInstance()方法可以有有參構造方法和無參構造方法,比較靈活。
獲取反射對象的方式有三種,分別是: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的方法,可以獲取類中的屬性信息,其中getFields可以獲取類中的公有屬性值,而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 ---");
通過getConstructors和getDeclaredConstructors的方法,可以獲取類中的構造方法信息,其中getConstructors可以獲取類中構造方法,而getDeclaredConstructors的方法,獲取所有類中的構造方法,但是無法獲取到父類的構造方法信息。格式如下:
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的方法,可以獲取類中的構造方法信息,其中getMethods可以獲取類中構造方法,而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 ---");
關于“Java反射如何使用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。