Java反射機(jī)制剖析:功能以及舉例
從《Java反射機(jī)制剖析:定義和API》的API我們看到了許多接口和類(lèi),我們能夠通過(guò)這些接口做些什么呢?
從上篇API中我們能看到它能夠完成下面的這些功能:
1) 獲得類(lèi)
A. 運(yùn)用getClass() (每個(gè)class都有此函數(shù))
i. String str = "abc";
ii. Class c1 = str.getClass();
B. 運(yùn)用Class.forName() (static method 最常被使用)
i. Class c1 = Class.forName ("java.lang.String");
ii. Class c2 = Class.forName ("java.awt.Button");
C. 運(yùn)用 .class 語(yǔ)法
i. Class c1 = String.class;
ii. Class c2 = java.awt.Button.class;
iii. Class c4 = int.class;
iv. Class c5 = int[].class;
D. 運(yùn)用 TYPE語(yǔ)法 ( primitive wrapper classes 基本數(shù)據(jù)類(lèi)型包裝類(lèi)的 TYPE語(yǔ)法)
i. Class c1 = Boolean.TYPE;
2) 獲得屬性
以下四個(gè)方法可以獲得屬性,主要參見(jiàn)的是Java.lang.class
|
|
|
|
|
|
|
|
3) 獲得方法()
以下四個(gè)方法可以獲得方法,要參見(jiàn)的是Java.lang.class
public Method getMethod(String name, ... ) |
返回一個(gè) Method 對(duì)象,它反映此 Class 對(duì)象所表示的類(lèi)或接口的指定公共成員方法 |
public Method[] getMethods() |
返回一個(gè)包含某些 Method 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類(lèi)或接口(包括那些由該類(lèi)或接口聲明的以及從超類(lèi)和超接口繼承的那些的類(lèi)或接口)的公共 member 方法 |
public Method getDeclaredMethod(String name,…) |
返回一個(gè) Method 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類(lèi)或接口的指定已聲明方法 |
public Method[] getDeclaredMethods() |
返回 Method 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象表示的類(lèi)或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問(wèn)和私有方法,但不包括繼承的方法 |
4) 獲取類(lèi)的構(gòu)造器
以下四個(gè)方法可以獲得方法,要參見(jiàn)的是Java.lang.class
public Constructor getConstructor(Class<?>... ) |
返回一個(gè) Constructor 對(duì)象,它反映此 Class 對(duì)象所表示的類(lèi)的指定公共構(gòu)造方法 |
public Constructor<?>[] getConstructors() |
返回一個(gè)包含某些 Constructor 對(duì)象的數(shù)組,這些對(duì)象反映此 Class 對(duì)象所表示的類(lèi)的所有公共構(gòu)造方法 |
Public Constructor<T> getDeclaredConstructor(Class<?>...) |
返回一個(gè) Constructor 對(duì)象,該對(duì)象反映此 Class 對(duì)象所表示的類(lèi)或接口的指定構(gòu)造方法 |
public Constructor<?>[] getDeclaredConstructors() |
返回 Constructor 對(duì)象的一個(gè)數(shù)組,這些對(duì)象反映此 Class 對(duì)象表示的類(lèi)聲明的所有構(gòu)造方法。它們是公共、保護(hù)、默認(rèn)(包)訪問(wèn)和私有構(gòu)造方法 |
示例代碼:
- import java.lang.reflect.Constructor;
- public class TestConstructor {
- /**
- * @param args
- * @throws ClassNotFoundException
- * @throws SecurityException
- * @throws NoSuchMethodException
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- Class classType=Class.forName(args[0]);
- Constructor Constructor= classType.getConstructor();
- System.out.println(Constructor.toString());
- }
- }
5) 新建類(lèi)的實(shí)例
調(diào)用類(lèi)的Class對(duì)象的newInstance方法
- import java.lang.reflect.Constructor;
- public class TestConstructor {
- /**
- * @param args
- * @throws ClassNotFoundException
- * @throws SecurityException
- * @throws NoSuchMethodException
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- Class classType=Class.forName(args[0]);
- //Constructor Constructor= classType.getConstructor();
- Object inst=classType.newInstance();
- System.out.println(inst);
- }
- }
調(diào)用默認(rèn)Constructor對(duì)象的newInstance方法
- import java.lang.reflect.Constructor;
- public class TestConstructor {
- /**
- * @param args
- * @throws ClassNotFoundException
- * @throws SecurityException
- * @throws NoSuchMethodException
- */
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- Class classType=Class.forName(args[0]);
- Constructor Constructor= classType.getConstructor();
- Object inst=Constructor.newInstance();
- System.out.println(inst);
- }
- }
調(diào)用帶參數(shù)Constructor對(duì)象的newInstance方法
- Class classType=User.class
- Constructor constructor2 =
- classType.getDeclaredConstructor(int.class, String.class);
- Object inst = constructor2.newInstance(1, "123");
- System.out.println(inst);
原文鏈接:http://blog.csdn.net/lfsf802/article/details/7239711
【編輯推薦】