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);
? ?
}
}
有相同的輸出
轉載于:https://blog.51cto.com/wufanxin/1657492
總結
以上是生活随笔為你收集整理的struts2原理分析之反射技术动态获取属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]“Ceph浅析”系列之(二)—Ce
- 下一篇: 用c#开发微信 (13) 微统计 - 阅