java語言的反射機制1

 

本文摘自:http://happyday.iteye.com/blog/309508

 

 

      java語言的反射機制爲是java語言所提供的一項特別吸引人的地方,利用反射我們可以對程序的運行進行動態的監控,開發使用反射特性的程序需要使用一些專門的工具類,這些工具類位於java.lang.reflect包中。

1.Class類簡介

    Class類屬於java.lang包中,不需要使用import語句的引入就可以直接使用,其對象代表一個類,並攜帶類的一些信息,主要包含構造器,方法和成員變量。

   注:a.java程序在運行的過程中,每個類加載後都在內存中產生一個對應的Class對象,一般來說,這個對象由系統來自動維護,不需要程序開發人員關心,

        b.這裏的Class中的“C”爲大寫,如果變成小寫就聲明成java的關鍵字了
下面首先通過一個列子來說明反射機制的使用

package com;  
import java.lang.reflect.Method;  
public class ReflectTest {  
    Method method [];  
    public ReflectTest(){  
        try{  
        Class c=Class.forName("com.ReflectTest");  
        method=c.getMethods();  
        }catch(ClassNotFoundException e){  
            e.printStackTrace();  
        }  
        if(method.length>0){  
            for(int i=0;i<method.length;i++){  
                System.out.println(method[i]);  
            }  
        }  
    }  
    public static void main(String args []){  
    new ReflectTest();  
    }  
}  

 

這個例子就介紹了反射機制的一些簡單的使用方法,首先Class.forName(String)獲得一個類的信息,然後就可以對這個類的構造器,方法和成員變量等進行反射了,注意的是:forName(String)中的字符串必須是類完整路徑,否則會出現ClassNotFoundException的異常。

 

 另外,由於java中的數組是對象,因此數組對象也可以調用getClass()方法獲取對應類的Class對象。 

  1. public class ArrayReflection {  
  2.         public ArrayReflection(){  
  3.         String []stringArray=new String[4];  
  4.         int[][]intArray=new int[4][4];  
  5.         Class sc=stringArray.getClass();  
  6.         Class ic=intArray.getClass();  
  7.         System.out.println("一維string數組對應的類名爲<span style="color: #000000;">:"+</span>sc.getName());  
  8.         System.out.println("二維int數組對應的類名爲:"+ic.getName());  
  9.     }  
  10.     public static void main(String args []){  
  11.         new ArrayReflection();  
  12.     }  
  13.   
  14. }  
  15. //運行結果爲:  
  16. 一維string數組對應的類名爲:[Ljava.lang.String;  
  17. 二維int數組對應的類名爲:[[I  

 從運進結果我們可以看出,數組對象也有對應的類,"["表示數組,兩個就表示二維數組。

在java中,每種基本數據類型都有對應的代號,對於int----I,boolean---Z,byte--B,char--C,long---J.可以到java網站查詢詳情

2.Field類的簡單介紹

  Field類的對象代表成員變量,攜帶的是成員變量的一些信息,需要注意的是,與Class類相似,Field對象不能通過構造方法的形式來創建對象,必須通過Class類提供的get方法來獲得。

import java.lang.reflect.Field;  
public class FieldReflectTest {  
    public static void main(String args []){  
        try{  
            Student stu=new Student(21,2003,true,"tom");  
            Class c=stu.getClass();  
            Field field[]=c.getFields();  
            for(int i=0;i<field.length;i++){  
            System.out.println(field[i].getName());  
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
    }  
  
}  
  
class Student{  
    public int age;  
    public int sno;  
    public boolean gender;  
    public String name;  
    public Student(int age,int sno,boolean gender,String name){  
        this.age=age;  
        this.sno=sno;  
        this.gender=gender;  
        this.name=name;  
    }  
}  
//運行結果 age,sno,gender,name 

 

從運行結果我們可以看出,我們可以利用對Student對象的反射,獲得Student類的全部全局變量信息,注:只能獲得修飾符爲public 的全局變量,如果修飾符該爲private將不能獲得。 

3.Mehod類的簡介,

  Method類的對象表示一個方法,主要用來攜帶方法的信息,它與Field類相似,不能通過構造器創建,而必須通過Class類的get方法來獲得,主要可以使用的方法有:1.getName()獲得方法名稱,2.Class[] getParameterTypes()返回參數的序列, 3.Class getReturnType()返回方法返回值的類型。4.Object invoke(Object object,Object []args)此方法用來調用Method對象代表的方法,返回值是被調用方法的返回值,注:該方法無論方法返回什麼值,都是做爲Object對象返回。

import java.lang.reflect.Method;  
public class MethodReflect {  
    public static void main(String args []){  
        try{  
            ForeMethod fore=new ForeMethod();  
            Class cl=fore.getClass();  
            Method method[]=cl.getMethods();  
            for(int i=0;i<method.length;i++){  
                System.out.println("方法的返回值:"+method[1].getReturnType().getName());  
                System.out.println("方法的名稱爲:"+method[i].getName());  
                Class []cls=method[i].getParameterTypes();  
                for(int j=0;j<cls.length;j++){  
                    System.out.print(method[i].getName()+"方法對應的參數爲:"+cls[i].getName());  
                }  
                System.out.println();  
            }  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
    }  
  
}  
 class ForeMethod{  
    public void sayHello(String name){  
        System.out.println("你好,"+name);  
    }  
    public String generateNum(int max,int min){  
        return (Math.random()*(max-min))+"";  
    }  
 }  

 

通過這個列子,我們就可以簡單的瞭解Method類在反射機制中的使用了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章