### 一,反射的簡介
反射是java中一種很強大的工具,能夠動態分析java的類的能力。在運行狀態中,對于任意一個類,通過反射都能知道這個類的屬性和方法。這種動態獲取的信息以及動態調用對象的方法的功能稱為Java語言的反射機制。反射的概念是由Smith在1982年首次提出的。
### 二、反射的作用
java的發射機制提供如下幾個方面的作用:
1.在運行時判斷任意一個對象所屬的類。
2.在運行時構造任意一個類的對象。
3.在運行時構造任意一個類所有的成員變量和方法。
4.在運行時動態創建對象,從一個對象是屬性拷貝到另一個對象相應的屬性上。
5.創建動態代理。
### 三、反射中常用的API
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
### 四、反射機制API的使用
**1.class類對象**
class類對象是反射機制的根源,由JVM生成(由于class類沒有public方法,無法直接new 一個class對象),可以通過Object.getClass()獲得class類型的對象
下面介紹如何獲取Class對象:
A.通過getClass()方法獲取,如String s=”agagad”;Class c=s.getClass();
B通過Class.forName()獲取(基本數據類型除外)。如Class c=Class.forName(“java.lang.String”);
C.通過.class 如Class c=Person.class;Class c1=String.class等
D.newInstance創建一個類對象
**2.Field的作用**
Field可以描述一個類的成員變量,且可以通過getDeclareFields()獲取類的所有成員變量。
Class c = Class.forName(“java.lang.Integer”);
//獲取所有的成員變量
Field[] fs = c.getDeclaredFields();
通過setAccessible()設置成員變量值可訪問的
實例如下:
~~~
Class c=Class.forName("com.greekw.pojo.User");
System.out.println("User類的全路徑類名"+c.getName());
System.out.println("User類的類名"+c.getSimpleName());
User user=new User();
//獲取類中所有的屬性
Field[] fields=c.getDeclaredFields();
for(Field f:fields){
//獲取變量的修飾符
System.out.println(Modifier.toString(f.getModifiers())+" ");
//獲取變量的類型
System.out.println(f.getType().getSimpleName());
//獲取變量名
System.out.println(f.getName());
//獲取成員變量的值
String fName=f.getName();
f.setAccessible(true);
System.out.println(fName+"的值為:"+f.get(user));
}
~~~
**3.Method類**
Method類可描述類的所有方法,可以通過getDeclaredMethods()獲取所有方法
實例如下:
~~~
//獲取一個類的所有方法
Class c=Class.forName("com.greekw.pojo.User");
Method[] methods=c.getDeclaredMethods();
for(Method m:methods){
//獲取方法修飾符
System.out.println(Modifier.toString(m.getModifiers())+" ");
//獲取方法類型
System.out.println(m.getReturnType().getName()+" ");
//獲取方法名
System.out.println(m.getName()+" ");
//獲取方法的參數
Class[] params=m.getParameterTypes();
for(int i=0;i<params.length;i++){
Class pc=params[i];
System.out.println(pc.getSimpleName()+",");
}
}
~~~
調用對象的方法,實現如下:
~~~
//調用對象的方法
m.setAccessible(true);//設置對象的屬性和方法是可訪問的
if(m.getName().equals("setIntValue")){
m.invoke(user, 50000);//修改屬性的值
}
if(m.getName().equals("setName")){
m.invoke(user, "測試");
}
~~~
**4.關于instanceof**
instanceof,用來判斷某個對象是否是某種類型,計算結果是一個boolean類型的值
如果一個對象繼承了某個類,或實現了某些接口,那么這個對象都是屬于哪些類型的
實例如下:
~~~
LittleDog ld=new LittleDog();
if(ld instanceof LittleDog){
System.out.println(ld的對象類型是LittleDog);
}
~~~
總之,java的反射機制是代碼更加靈活,更容易體現面向對象的思想,在設計模式,配置文件讀取,以及三大框架中都有用到,是一種構建工具類的利器。