java 中如何獲取字節(jié)碼文件的相關(guān)內(nèi)容
反射機(jī)制是指在運(yùn)行狀態(tài)中,對任意一個類(class文件),都能知道這個類的所有屬性和方法;對任意一個對象,都能調(diào)用這個對象的方法和屬性。這種動態(tài)的獲取信息和動態(tài)的調(diào)用對象的方法的功能稱為——Java語言的反射機(jī)制。
簡單點(diǎn)說,動態(tài)的獲取類中的信息,這就是Java的反射機(jī)制。
在Java的反射機(jī)制中,我們可以通過配置文件信息,然后通過類名來獲取類中包含的詳細(xì)信息,如構(gòu)造函數(shù)、成員變量和成員函數(shù)等。在接下來,作者將分別演示如何通過類名來獲取類中包含的信息。
一、獲取字節(jié)碼文件的構(gòu)造函數(shù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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)獲取指定名稱對應(yīng)類中的所體現(xiàn)的對象時,而且該對象的初始化不適用空參的構(gòu)造函數(shù) * 可以先通過該類的字節(jié)碼文件對象,獲取空參的構(gòu)造函數(shù) * 該方法為:getConstructor(parameterTypes) */ // 包名一定要寫全,否則會報"java.lang.ClassNotFoundException"異常 String name = "src.Person" ; // 找尋該名稱類文件,并加進(jìn)內(nèi)存,產(chǎn)生Class對象 Class clazz = Class.forName(name); // 獲取指定的構(gòu)造函數(shù)對象 Constructor constructor = clazz.getConstructor(String. class , int . class ); // 通過該構(gòu)造器對象的newInstance進(jìn)行對象的初始化 constructor.newInstance( "小明" , 12 ); } public static void createNewObject() throws ClassNotFoundException, InstantiationException, IllegalAccessException { String name = "src.Person" ; // 找尋該名稱類文件,并加進(jìn)內(nèi)存,產(chǎn)生Class對象 Class clazz = Class.forName(name); // 產(chǎn)生該類的實(shí)例對象(空參) Object obj = clazz.newInstance(); } } |
二、獲取字節(jié)碼文件的成員變量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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" ); // 對私有字段的訪問取消權(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ù)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
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); } } } |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/qq_35246620/article/details/53584524