Java Reflection (JAVA反射)
Reflection 是 Java 程序開發語言的特徵之一,它允許運行中的 Java 程序對自身進行檢查,或者說“自審”,並能直接操作程序的內部屬性。例如,使用它能獲得 Java 類中各成員的名稱並顯示出來。
Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟件組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。
像Struts2.0 Hibernate Spring 都是利用了這一特性。
下面先看一個簡單例子 打印一個類裏面的屬性和方法,代碼比較簡單,在這裏久不解釋了,運行一下看看結果就明白了。
- importjava.lang.reflect.Field;
- importjava.lang.reflect.Method;
- importjava.lang.reflect.Modifier;
- publicclassTest{
- publicstaticvoidmain(String[]args){
- show("java.util.Date");
- }
- /**
- *打印一個類裏面定義的屬性和方法
- *@paramclassName
- */
- @SuppressWarnings("unchecked")
- privatestaticvoidshow(StringclassName){
- try{
- Classc=Class.forName(className);
- //獲取定義的屬性
- Field[]fields=c.getDeclaredFields();
- System.out.println(className+"類包含的屬性有:");
- for(Fieldf:fields){
- intmod=f.getModifiers();
- System.out.println(((mod==0)?""
- :(Modifier.toString(mod)+""))
- +getTypeName(f.getType())+""+f.getName());
- }
- System.out.println("------------------------------------------------");
- //獲取定義的方法
- Method[]methods=c.getDeclaredMethods();
- System.out.println(className+"類包含的方法有:");
- StringBuffersb=newStringBuffer();
- for(Methodm:methods){
- intmod=m.getModifiers();
- if(mod!=0){
- //得到訪問控制修飾符
- sb.append(Modifier.toString(mod)+"");
- }
- sb.append(getTypeName(m.getReturnType())+"");
- sb.append(m.getName()+"(");
- Class[]params=m.getParameterTypes();
- for(intj=0;j<params.length;j++){
- sb.append(getTypeName(params[j]));
- if(j<(params.length-1))
- sb.append(",");
- }
- sb.append(")");
- System.out.println(sb.toString());
- sb.delete(0,sb.length());
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- /**
- *此方法來自java.lang.reflect.Field
- *@paramtype
- *@return
- */
- @SuppressWarnings("unchecked")
- privatestaticStringgetTypeName(Classtype){
- if(type.isArray()){//如果是數組類型
- try{
- Classcl=type;
- intdimensions=0;//數組的維度
- while(cl.isArray()){
- dimensions++;
- cl=cl.getComponentType();
- }
- StringBuffersb=newStringBuffer();
- sb.append(cl.getName());
- for(inti=0;i<dimensions;i++){
- sb.append("[]");
- }
- returnsb.toString();
- }catch(Throwablee){/*FALLTHRU*/
- }
- }
- returntype.getName();
- }
- }
-
在製作這個例子的時候參考了java.lang.reflect.Method.toString() 方法 和java.lang.reflect.Field.toString()方法。
今天先來個簡單的例子,下一篇將介紹如何利用反射機制。最常用的就是 從request 到pojo的屬性拷貝,以及兩個JavaBean之間的屬性複製