淺析JAVA反射(一)

Java Reflection (JAVA反射)
Reflection 是 Java 程序開發語言的特徵之一,它允許運行中的 Java 程序對自身進行檢查,或者說“自審”,並能直接操作程序的內部屬性。例如,使用它能獲得 Java 類中各成員的名稱並顯示出來。
Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟件組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。

像Struts2.0 Hibernate Spring 都是利用了這一特性。

下面先看一個簡單例子 打印一個類裏面的屬性和方法,代碼比較簡單,在這裏久不解釋了,運行一下看看結果就明白了。

  1. importjava.lang.reflect.Field;
  2. importjava.lang.reflect.Method;
  3. importjava.lang.reflect.Modifier;
  4. publicclassTest{
  5. publicstaticvoidmain(String[]args){
  6. show("java.util.Date");
  7. }
  8. /**
  9. *打印一個類裏面定義的屬性和方法
  10. *@paramclassName
  11. */
  12. @SuppressWarnings("unchecked")
  13. privatestaticvoidshow(StringclassName){
  14. try{
  15. Classc=Class.forName(className);
  16. //獲取定義的屬性
  17. Field[]fields=c.getDeclaredFields();
  18. System.out.println(className+"類包含的屬性有:");
  19. for(Fieldf:fields){
  20. intmod=f.getModifiers();
  21. System.out.println(((mod==0)?""
  22. :(Modifier.toString(mod)+""))
  23. +getTypeName(f.getType())+""+f.getName());
  24. }
  25. System.out.println("------------------------------------------------");
  26. //獲取定義的方法
  27. Method[]methods=c.getDeclaredMethods();
  28. System.out.println(className+"類包含的方法有:");
  29. StringBuffersb=newStringBuffer();
  30. for(Methodm:methods){
  31. intmod=m.getModifiers();
  32. if(mod!=0){
  33. //得到訪問控制修飾符
  34. sb.append(Modifier.toString(mod)+"");
  35. }
  36. sb.append(getTypeName(m.getReturnType())+"");
  37. sb.append(m.getName()+"(");
  38. Class[]params=m.getParameterTypes();
  39. for(intj=0;j<params.length;j++){
  40. sb.append(getTypeName(params[j]));
  41. if(j<(params.length-1))
  42. sb.append(",");
  43. }
  44. sb.append(")");
  45. System.out.println(sb.toString());
  46. sb.delete(0,sb.length());
  47. }
  48. }catch(Exceptione){
  49. e.printStackTrace();
  50. }
  51. }
  52. /**
  53. *此方法來自java.lang.reflect.Field
  54. *@paramtype
  55. *@return
  56. */
  57. @SuppressWarnings("unchecked")
  58. privatestaticStringgetTypeName(Classtype){
  59. if(type.isArray()){//如果是數組類型
  60. try{
  61. Classcl=type;
  62. intdimensions=0;//數組的維度
  63. while(cl.isArray()){
  64. dimensions++;
  65. cl=cl.getComponentType();
  66. }
  67. StringBuffersb=newStringBuffer();
  68. sb.append(cl.getName());
  69. for(inti=0;i<dimensions;i++){
  70. sb.append("[]");
  71. }
  72. returnsb.toString();
  73. }catch(Throwablee){/*FALLTHRU*/
  74. }
  75. }
  76. returntype.getName();
  77. }
  78. }

在製作這個例子的時候參考了java.lang.reflect.Method.toString() 方法 和java.lang.reflect.Field.toString()方法。

今天先來個簡單的例子,下一篇將介紹如何利用反射機制。最常用的就是 從request 到pojo的屬性拷貝,以及兩個JavaBean之間的屬性複製

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 2777
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章