struts2原理分析之反射技術動態獲取屬性

反射技術動態獲取屬性
知道struts2的流程的鄉親們都知道。struts2採用了動態獲取屬性的方法,
將表單裏的數據傳給了Action。
例如;
在struts2裏有如下配置文件
<action name="MyAction" class="com.lin.test.ActionTest" method="execute">
<result name="success">success.jsp</result>
<result name="fail">fail.jsp</result>
</action>
com.lin.test.ActionTest的實現如下:
package com.lin.test;
public class ActionTest {
     private String userName;
     private String passWord;
public String getUserName() {
  return userName;
}
public void setUserName(String userName) {
  this.userName = userName;
}
public String getPassWord() {
  return passWord;
}
public void setPassWord(String passWord) {
  this.passWord = passWord;
}
     public String execute(){
      if((userName==null)||(userName.equals("")))
      {
       System.out.println("text爲空。。。。");
       return "fail";
      
      }else{
       System.out.println("username:     "+userName);
          return "success";
       
      }
   }
}
把test.jsp文件的表單數據提交給struts2 配置的Action裏,這裏叫做MyAction
<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>登陸</title>
</head>
<body>
<s:form action="MyAction" method="post">
  <s:textfield label="用戶名" name="userName"/><!--標籤的name 屬性是針對於後臺,id是對前臺-->
  <s:textfield label="密碼" name="passWord"/>
   <s:submit value="提交"/>
  </s:form>
</body>
</html>
測試:
輸入用戶名後點擊確定,Action的java代碼裏在控制檯裏成功的輸出的text的值

若text的內容爲空

點擊確定後,由於在Action的方法裏對輸入的內容進行了判斷,此時輸出
text爲空。

通過以上例子,Action獲取了輸入的值,並且進行了判斷。
那麼這個原理是怎麼實現的呢?
答案:反射機制
,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法。
demo
User類,加上tostring方法,方便打印
class User {
    public User(){}
   
    private String username;
    private String userid;
    public String getUserid() {
        return userid;
    }
    @Override
public String toString() {
  return "User [username=" + username + ", userid=" + userid + "]";
}
public void setUserid(String userid) {
        this.userid = userid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}
public class Reflect {
public static void main(String[] args) throws Exception {
//創建user1對象
User user1 = new User();
user1.setUsername("arthinking");
user1.setUserid("001");
String username = "arthinking";
String userid = "001";
//通過user1對象獲取Class
Class<?> classType = user1.getClass();
//生成user2對象
Object user2 = classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
//從user1對應的Class對象中獲取所有的屬性
Field[] fields = classType.getDeclaredFields();
for(int i=0; i<fields.length; i++){
     Field field = fields;
     //動態生成getter和setter方法
     String fieldName = field.getName();
     String firstChar = fieldName.substring(0,1).toUpperCase();
     String getterName = "get" + firstChar + fieldName.substring(1);
     String setterName = "set" + firstChar + fieldName.substring(1);
     Method getter = classType.getMethod(getterName);
     Method setter = classType.getMethod(setterName, new Class[]{field.getType()});
     Object result = getter.invoke(user1);
     setter.invoke(user2, new Object[]{result});
}
Syso(“User1”+user1);
System.out.println("user2      "+user2);
   
}
}
有相同的輸出

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