通過學習瞭解到, Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲Java語言的反射機制。
Java反射機制主要提供下面幾種用途:
- 在運行時判斷任意一個對象所屬的類
- 在運行時構造任意一個類的對象
- 在運行時判斷任意一個類所具有的成員變量和方法
- 在運行時調用任意一個對象的方法
一個例子程序就能很好的解釋反射了.
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Reflection {
public static void main(String[] args) throws ClassNotFoundException,
InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException {
String str = "T";
Class c = Class.forName(str);// Class類表示正在運行的類,它沒有構造方法,現在的class類所表示的類是T
Object o = c.newInstance();// 創建正在運行的Class對象所表示的類的一個實例 此時就是 new T()
// 相當於 Object o =new T() o就可以當一個正常的實例T()使用了 也可以直接轉換 T
// o=(T)c.newInstance()
System.out.println(o.getClass().getName());
//Field 類能拿到一個類的屬性 參考java.lang.reflect.*
Method methods[] = c.getMethods();
for (Method m : methods) {
if (m.getName().equals("f")) {
// m.invoke(o, null);//調用m這個方法 相當於o.m()
// 第二個參數是m這個方法的可變參數,可以根據情況傳0-n個參數
m.invoke(o, 1, 2);
// 例如,m.invoke(o,"aa",5,"ss")
//m.getReturnType() 拿到返回值類型
Object ps[] = m.getParameterTypes();//可以查看這個方法的參數類型
for (Object p : ps) {
System.out.println(p.toString());//一次打印出方法m的參數類型int,int
}
}
}
}
}
class T {
public T() {
System.out.println("T constractor!");
}
public void f(int i, int j) {
System.out.println("T fff");
}
}