JAVA 反射技術 萬用分頁標籤 核心代碼 (圖)

Java中,反射是一種強大的工具。它使您能夠創建靈活的代碼,這些代碼可以在運行時裝配,無需在組件之間進行源代表鏈接。反射允許我們在編寫與執行時,使我們的程序代碼能夠接入裝載到JVM中的類的內部信息,而不是源代碼中選定的類協作的代碼。這使反射成爲構建靈活的應用的主要工具。但需注意的是:如果使用不當,反射的成本很高。

下面要介紹的例子是我從事struts開發時開發 萬用分頁標籤 所用到的技術,該標籤能根據傳入的bean list自動生成分頁表格

很多框架級應用中都必須用反射技術才能達到靈活泛用的目的,典型的struts,spring,hibernate等

下面我們就切入正題,看看反射技術是怎麼應用的

首先我們建立一個工程,名爲JavaReflect,再建立TestBean,TestMain,TabTest存入com.sdna.reflect包中

結構如下
如圖:1

==========TestBean 爲任意一個符合Bean命名規範的類
package com.sdna.reflect;

public class TestBean {
    private int userID;
    private String userName;
    private String userSex;
    private int userAge;
    private String userAddr;

    public TestBean() {
        try {
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    private void jbInit() throws Exception {

    }

    public void setUserID(int userID) {
        this.userID = userID;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    public void setUserAddr(String userAddr) {
        this.userAddr = userAddr;
    }

    public int getUserID() {
        return userID;
    }

    public String getUserName() {
        return userName;
    }

    public String getUserSex() {
        return userSex;
    }

    public int getUserAge() {
        return userAge;
    }

    public String getUserAddr() {
        return userAddr;
    }
}

====================
==========TestMain 爲測試打印某實例所有方法,參數,返回值
package com.sdna.reflect;

import java.lang.reflect.*;

public class TestMain {
    public TestMain() {
    }

    public static void main(String[] args) {

        TestBean obj = new TestBean();

        Class c = obj.getClass();
        Method[] theMethods = c.getMethods();
        for (int i = 0; i < theMethods.length; i++) {
            String methodString = theMethods[i].getName();
            System.out.println("Name: " + methodString);
            String returnString =
                    theMethods[i].getReturnType().getName();
            System.out.println(" Return Type: " + returnString);
            Class[] parameterTypes = theMethods[i].getParameterTypes();
            System.out.print(" Parameter Types:");
            for (int k = 0; k < parameterTypes.length; k++) {
                String parameterString = parameterTypes[k].getName();
                System.out.print(" " + parameterString);
            }
            System.out.println("/n");
        }

        try {
            theMethods[2].invoke(obj, "sky");
            System.out.println(obj.getUserName());
        } catch (InvocationTargetException ex) {
            ex.printStackTrace();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        }


    }
}

====================
==========TabTest 爲讀任意一個符合Bean命名規範的實例
package com.sdna.reflect;

import java.lang.reflect.*;

public class TabTest {
    public TabTest() {
    }

    public static void main(String[] args) {

        TestBean obj = new TestBean();
        obj.setUserID(10001);
        obj.setUserName("sky");
        obj.setUserSex("boy");
        obj.setUserAge(23);
        obj.setUserAddr("wuhan");

        Class objClass = obj.getClass();
        Field fields[] = objClass.getDeclaredFields();
//        Method[] methods = objClass.getMethods();
        Method tempMethod = null;
        String strMethod = null;

        for (int i = 0; i < fields.length; i++) {
            try {
                String fieldName = fields[i].getName();
                Class typeClass = fields[i].getType();
                String fieldType = typeClass.getName();
                strMethod = fieldName;

                strMethod = "get" +
                            strMethod.replaceFirst(strMethod.substring(0, 1),
                        strMethod.substring(0, 1).toUpperCase());

                tempMethod = objClass.getMethod(strMethod);
                System.out.println("Name: " + fieldName + ", Type: "
                                   + fieldType + ", Values: " + tempMethod.invoke(obj));

            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

    }
}

====================

TestMain運行結果
如圖:2

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