下面的例子實現了一個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方法設置和獲得屬性值.