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語言的反射機(jī)制。
簡(jiǎn)單點(diǎn)說,動(dòng)態(tài)的獲取類中的信息,這就是Java的反射機(jī)制。
在Java的反射機(jī)制中,我們可以通過配置文件信息,然后通過類名來獲取類中包含的詳細(xì)信息,如構(gòu)造函數(shù)、成員變量和成員函數(shù)等。在接下來,作者將分別演示如何通過類名來獲取類中包含的信息。
一、獲取字節(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ù)
* 可以先通過該類的字節(jié)碼文件對(duì)象,獲取空參的構(gòu)造函數(shù)
* 該方法為:getConstructor(parameterTypes)
*/
// 包名一定要寫全,否則會(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);
// 通過該構(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ì)私有字段的訪問取消權(quá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不掃描@repository的問題及解決
這篇文章主要介紹了springboot不掃描@repository的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)圖論霍夫曼樹及其編碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
Java利用happen-before規(guī)則如何實(shí)現(xiàn)共享變量的同步操作詳解
這篇文章主要給大家介紹了關(guān)于Java利用happen-before規(guī)則實(shí)現(xiàn)共享變量的同步操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
mybatis-plus實(shí)現(xiàn)打印完整sql語句
這篇文章主要介紹了mybatis-plus實(shí)現(xiàn)打印完整sql語句方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
idea中創(chuàng)建多module的maven工程的方法
這篇文章主要介紹了idea中創(chuàng)建多module的maven工程的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
Eclipse創(chuàng)建java程序可執(zhí)行jar包教程
這篇文章主要為大家分享了Eclipse創(chuàng)建java程序可執(zhí)行jar包教程,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
SpringCloud用Zookeeper搭建配置中心的方法
本篇文章主要介紹了SpringCloud用Zookeeper搭建配置中心的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04

