Java反射機制剖析:功能以及舉例
從《Java反射機制剖析:定義和API》的API我們看到了許多接口和類,我們能夠通過這些接口做些什么呢?
從上篇API中我們能看到它能夠完成下面的這些功能:
1) 獲得類
A. 運用getClass() (每個class都有此函數)
i. String str = "abc";
ii. Class c1 = str.getClass();
B. 運用Class.forName() (static method 最常被使用)
i. Class c1 = Class.forName ("java.lang.String");
ii. Class c2 = Class.forName ("java.awt.Button");
C. 運用 .class 語法
i. Class c1 = String.class;
ii. Class c2 = java.awt.Button.class;
iii. Class c4 = int.class;
iv. Class c5 = int[].class;
D. 運用 TYPE語法 ( primitive wrapper classes 基本數據類型包裝類的 TYPE語法)
i. Class c1 = Boolean.TYPE;
2) 獲得屬性
以下四個方法可以獲得屬性,主要參見的是Java.lang.class
|
|
|
|
|
|
|
|
3) 獲得方法()
以下四個方法可以獲得方法,要參見的是Java.lang.class
public Method getMethod(String name, ... ) |
返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法 |
public Method[] getMethods() |
返回一個包含某些 Method 對象的數組,這些對象反映此 Class 對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法 |
public Method getDeclaredMethod(String name,…) |
返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法 |
public Method[] getDeclaredMethods() |
返回 Method 對象的一個數組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法 |
4) 獲取類的構造器
以下四個方法可以獲得方法,要參見的是Java.lang.class
public Constructor getConstructor(Class<?>... ) |
返回一個 Constructor 對象,它反映此 Class 對象所表示的類的指定公共構造方法 |
public Constructor<?>[] getConstructors() |
返回一個包含某些 Constructor 對象的數組,這些對象反映此 Class 對象所表示的類的所有公共構造方法 |
Public Constructor<T> getDeclaredConstructor(Class<?>...) |
返回一個 Constructor 對象,該對象反映此 Class 對象所表示的類或接口的指定構造方法 |
public Constructor<?>[] getDeclaredConstructors() |
返回 Constructor 對象的一個數組,這些對象反映此 Class 對象表示的類聲明的所有構造方法。它們是公共、保護、默認(包)訪問和私有構造方法 |
示例代碼:
- 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) 新建類的實例
調用類的Class對象的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);
- }
- }
調用默認Constructor對象的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);
- }
- }
調用帶參數Constructor對象的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
【編輯推薦】