java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容
java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容
反射機(jī)制是指在運(yùn)行狀態(tài)中,對(duì)任意一個(gè)類(class文件),都能知道這個(gè)類的所有屬性和方法;對(duì)任意一個(gè)對(duì)象,都能調(diào)用這個(gè)對(duì)象的方法和屬性。這種動(dòng)態(tài)的獲取信息和動(dòng)態(tài)的調(diào)用對(duì)象的方法的功能稱為——Java語(yǔ)言的反射機(jī)制。
簡(jiǎn)單點(diǎn)說(shuō),動(dòng)態(tài)的獲取類中的信息,這就是Java的反射機(jī)制。
在Java的反射機(jī)制中,我們可以通過(guò)配置文件信息,然后通過(guò)類名來(lái)獲取類中包含的詳細(xì)信息,如構(gòu)造函數(shù)、成員變量和成員函數(shù)等。在接下來(lái),作者將分別演示如何通過(guò)類名來(lái)獲取類中包含的信息。
一、獲取字節(jié)碼文件的構(gòu)造函數(shù)
import java.lang.reflect.Constructor; public class GetClassConstructor { public static void main(String[] args) throws Exception { createNewObject_2(); } public static void createNewObject_2() throws Exception { /** * 當(dāng)獲取指定名稱對(duì)應(yīng)類中的所體現(xiàn)的對(duì)象時(shí),而且該對(duì)象的初始化不適用空參的構(gòu)造函數(shù) * 可以先通過(guò)該類的字節(jié)碼文件對(duì)象,獲取空參的構(gòu)造函數(shù) * 該方法為:getConstructor(parameterTypes) */ // 包名一定要寫(xiě)全,否則會(huì)報(bào)"java.lang.ClassNotFoundException"異常 String name = "src.Person"; // 找尋該名稱類文件,并加進(jìn)內(nèi)存,產(chǎn)生Class對(duì)象 Class clazz = Class.forName(name); // 獲取指定的構(gòu)造函數(shù)對(duì)象 Constructor constructor = clazz.getConstructor(String.class, int.class); // 通過(guò)該構(gòu)造器對(duì)象的newInstance進(jìn)行對(duì)象的初始化 constructor.newInstance("小明", 12); } public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException { String name = "src.Person"; // 找尋該名稱類文件,并加進(jìn)內(nèi)存,產(chǎn)生Class對(duì)象 Class clazz = Class.forName(name); // 產(chǎn)生該類的實(shí)例對(duì)象(空參) Object obj = clazz.newInstance(); } }
二、獲取字節(jié)碼文件的成員變量
import java.lang.reflect.Field; public class GetClassField { public static void main(String[] args) throws Exception { getField(); } /** * 獲取字節(jié)碼文件中的成員變量 */ public static void getField() throws Exception { Class clazz = Class.forName("src.Person"); Field field = null; // 獲取本類字段,包含私有 field = clazz.getDeclaredField("age"); // 對(duì)私有字段的訪問(wèn)取消權(quán)限檢查,可稱之為暴力訪問(wèn) field.setAccessible(true); Object obj = clazz.newInstance(); field.set(obj, Integer.valueOf(89)); Object o = field.get(obj); System.out.println(o); } }
三、獲取字節(jié)碼文件的成員函數(shù)
import java.lang.reflect.Constructor; import java.lang.reflect.Method; public class GetClassMethod { public static void main(String[] args) throws Exception { getMethod_3(); } public static void getMethod_3() throws Exception { Class clazz = Class.forName("src.Person"); Method method = clazz.getMethod("walkInfo", new Class[]{String.class, Integer.TYPE}); Object obj = clazz.newInstance(); method.invoke(obj, new Object[]{"小強(qiáng)", Integer.valueOf(20)}); } public static void getMethod_2() throws Exception { Class clazz = Class.forName("src.Person"); // 獲取空參數(shù)的方法 Method method = clazz.getMethod("show", (Class[]) null); Constructor constructor = clazz.getConstructor(new Class[]{String.class, Integer.TYPE}); Object obj = constructor.newInstance(new Object[]{"小明", Integer.valueOf(12)}); method.invoke(obj, (Object[]) null); } /** * 獲取指定Class中的公有函數(shù) */ public static void getMethod() throws Exception { Class clazz = Class.forName("src.Person"); // 獲取的都是類中的公有方法 Method[] methods = clazz.getMethods(); // 獲取本類中的所有方法 methods = clazz.getDeclaredMethods(); Method[] var5 = methods; int var4 = methods.length; for (int var3 = 0; var3 < var4; ++var3) { Method method = var5[var3]; System.out.println(method); } } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
使用springboot開(kāi)發(fā)的第一個(gè)web入門程序的實(shí)現(xiàn)
這篇文章主要介紹了使用springboot開(kāi)發(fā)的第一個(gè)web入門程序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java23種設(shè)計(jì)模式中的單例模式你了解嗎
這篇文章主要為大家詳細(xì)介紹了Java23種設(shè)計(jì)模式中的單例模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別
本文主要介紹了MySQL中關(guān)鍵字UNION和UNION ALL的區(qū)別,深入探討UNION和UNION ALL的定義、用法、主要區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06解決Spring或SpringBoot開(kāi)啟事務(wù)以后無(wú)法返回自增主鍵的問(wèn)題
這篇文章主要介紹了解決Spring或SpringBoot開(kāi)啟事務(wù)以后無(wú)法返回自增主鍵的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07使用jpa之動(dòng)態(tài)插入與修改(重寫(xiě)save)
這篇文章主要介紹了使用jpa之動(dòng)態(tài)插入與修改(重寫(xiě)save),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java面試題篇之Sleep()方法與Wait()方法的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Java面試題篇之Sleep()方法與Wait()方法區(qū)別的相關(guān)資料,wait()是Object類中的方法,而sleep()是Thread類中的靜態(tài)方法,wait()方法用于多個(gè)線程之間的協(xié)作和通信,而sleep()方法用于線程的休眠,需要的朋友可以參考下2024-07-07