1. 程式人生 > >struts2框架是如何應用反射的

struts2框架是如何應用反射的

         在實際開發中很少用到反射,但在許多框架,像struts2等,下面我就用個簡單的例子解釋反射在struts2中的應用過程

// 根據使用者請求的action名,從配置檔案找到該action結點得到class路徑及呼叫的action方法名,以以下片斷為例
        /**
         * <action name="testAction" class="com.action.StrutsTest" method="execute"> <result
         * name="success">/WEB-INF/jsp/userManage/login.jsp</result> </action>
         */
        String actionClass = "com.action.StrutsTest";// action的執行class
        String actionMethod = "execute";// 要執行的action方法

        // 對應表單裡的引數,呼叫action對應引數的setter方法來注入
        Map<String, String> paramMap = (Map<String, String>) request.getParameterMap();// 在這裡我假設所有action的屬性都是String型別的

        Class class1 = Class.forName(actionClass); // 得到action的class物件

        Object object = class1.newInstance();// 構造一個action例項

        // 將表單裡的所有引數值設定到action中
        for (Entry<String, String> entry : paramMap.entrySet())
        {
            // 得到每個引數的setter方法
            Method method =
                class1.getMethod(new StringBuffer("set").append(entry.getKey().substring(0, 1).toUpperCase())
                    .append(entry.getKey().substring(1))
                    .toString(), entry.getKey().getClass());

            // 呼叫action中每個引數的setter方法來給action屬性注入值
            method.invoke(object, entry.getValue());
        }

        // 得到處理action請求的函式入口
        Method method2 = class1.getMethod(actionMethod);

        String returnSuccess = String.valueOf(method2.invoke(object));//處理請求,得到返回值

        // 實際上這裡應該是根據returnSuccess去對應action下取出jsp路徑的,這裡我就寫死
        String jspPath = "index.jsp";

        request.getRequestDispatcher(jspPath).forward(request, response);// 類似struts1跳到指定頁面