Java反射機制的例子

下面的例子實現了一個bean類對象,這裏只是簡單地給其屬性value 定義了一個getter和一個setter方法.Bean代碼如下:


public class Bean {
 String value;
 public String getValue(){
  return value;
 }
 public void setValue(String n){
  value=n;
 }
}
然後定義一個Test類.在Test類的main函數中,演示如何通過Java反射機制,不通過Bean.setValue()方法即可以給value賦值;不通過getValue()方法即可獲得Value值.

Test測試代碼如下:

import java.lang.reflect.Method;
public class Test {
 public static void main(String[] args) {
  Bean bean=new Bean();
  try{
   Class c=Class.forName("Bean");
   System.out.println(c.getName());
   Method[] methods=c.getMethods();
   
   System.out.println(methods[1].getName());
   methods[1].invoke(bean, "this is the value");
   System.out.println(methods[0].getName());
   System.out.println(methods[0].invoke(bean,null));
  }catch(Exception e){
   e.printStackTrace();
  }
 }

}
在上面的代碼中,通過Class.forName("Bean")即可以通過.class文件來獲得Bean類的字節碼.然後通過c.getMethods()方法獲得其所有方法.在字節碼中,第一個方法methos[0]是getValue(),第二個方法methods[1]是setValue(),那麼,通過Method.invoke()方法即可直接通過字節碼調用這兩個方法來運行,而不必通過源代碼的Bean.getValue()和Bean.setValue().

上面的代碼運行結果顯示:

Bean
setValue
getValue
this is the value

Java的反射接口被放置在java.lang.rerflect包中.可以通過反射接口獲得.class文件,然後通過Class獲得其實現的接口,父類,包名,屬性,方法,修飾符等信息;通過Constructor類可以構造這個類;通過Menthod類可以獲得方法的名字,返回值,修飾符,參數等信息,使用invoke方法還可以讓這個方法執行;通過Field類可以獲得屬性的名字,修飾符等信息;使用反射機制提供的Proxy和InvocationHandler接口還可以攔截某個方法的調用,執行一段自己的替代程序.

在Hibernate中,Java的反射機制在org.hibernate.property包中得到了較多的運用.例如,查看這個包中的BasicPropertyAccessor.BasicSettor和BasicPropertyAccessor.BasicGetter類,即可看到其中的set(),get()方法使用Java反射機制中的method.invoke(),以此使用POJO對象中的setter,getter方法設置和獲得屬性值.

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