请教: 如何根据字符串值动态给JAVA成员变量赋值

chongworm 2012-06-28 06:51:37
有如下的POJO类:
public class UserInfo {
private int userID;
private String userName;
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}

现在有另一字符串如下:
String userInfo = "userID=12,userName='Zhaomin'";

其中字符串中的userID和userName与java类中的成员变量名一致.

问题: 如何把字符串中的userID和userName的值设置给java类中的相应成员变量?
...全文
650 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
api工厂 2012-06-28
  • 打赏
  • 举报
回复
这个就得用反射。
刚好看到一篇文章,几行代码就搞定了,可以看看
http://www.javafan.org/article.do?id=bac034c6380ad47d01383378d71d000d
TinySun 2012-06-28
  • 打赏
  • 举报
回复
为什么大伙儿在这个地方那么喜欢用反射???是受一楼的影响么?
bree06 2012-06-28
  • 打赏
  • 举报
回复
如果字符串中的userID和userName与java类中的成员变量名一致的话可以自己裁分字符串,然后调用set方法赋值。
public class Demo28 {

/**
* @param args
*/
public static void main(String[] args) {
String userInfo = "userID=12,userName=Zhaomin'";
UserInfo info = new Demo28().setInfo(userInfo, new UserInfo());
System.out.println(info.getUserID());
System.out.println(info.getUserName());
}

public UserInfo setInfo(String userInfo, UserInfo user) {
String[] info = userInfo.split(",");
if (info.length != 2) return user;
if ("userID".equals(info[0].substring(0, info[0].indexOf("=")))) {
String id = info[0].substring(info[0].indexOf("=")+1);
// 如果id不是整数,id默认为0
user.setUserID(id.matches("\\d+") ? Integer.parseInt(id) : 0);
}
if ("userName".equals(info[1].substring(0, info[1].indexOf("=")))) {
String name = "";
// userName='Zhaomin', userName='Zhaomin, userName=Zhaomin', userName=Zhaomin四种情况
name = info[1].contains("='") ? info[1].substring(info[1].indexOf("'")+1) : info[1].substring(info[1].indexOf("=")+1);
name = name.endsWith("'") ? name.substring(0, name.length() - 1) : name;
user.setUserName(name);
}
return user;
}
}
fengshuo850420 2012-06-28
  • 打赏
  • 举报
回复
String userInfo = "userID=12,userName='Zhaomin'";
先将该字符串分割,得到userID和userName的值,然后通过get/set方法设置
桃园闲人 2012-06-28
  • 打赏
  • 举报
回复
先通过“,”将字符串分割成数组,然后再对数组每一项用‘=’分割成数组,最终分割成
String[][] userinfo = {{userID,12},{UserName,Zhaomin}...};
然后用反射通过字符串(userinfo[i][0])查找对应的属性,然后将值(userinfo[i][1])注入到属性中。
默默的伟哥 2012-06-28
  • 打赏
  • 举报
回复
第一种方法:
1、如果给出的字符串是你自己定义的规则,那么你自己解析成Map<String,Object> 这种形式,key是属性名,value是属性值
2、用反射嗲用Bean的set方法,把值弄进去 或者 用Spring的BeanUtils,Apache的BeanUtils貌似不支持Map拷贝

第二种方法:
给出的字符串统一用JSON 或者 XML的格式,(建议这么用)
然后用别的开源项目,如 XStream、Jackson、json-lib 之类的去解析,网上有例子的,你可以找一下
  • 打赏
  • 举报
回复
反射机制。。
huage 2012-06-28
  • 打赏
  • 举报
回复
有这么复杂吗 还反射 用错地方了,
直接 把pojo new出来 把解析到的数据set进去就好了啊

String s = "userID=12,userName='Zhaomin'" ;
String ss [] = s.split(",") ;
UserInfo user = new UserInfo();

for (int i = 0; i < ss.length; i++) {
String sss [] = ss[i].split("=") ;

if(userIDs[0].equals("userID")) {
user.setUserID(new Integer(sss[1]));
}
if(userIDs[0].equals("userName")) {
user.setUserName(sss[1].replaceAll("'", ""));
}

AndyXuq 2012-06-28
  • 打赏
  • 举报
回复
5楼正解
安特矮油 2012-06-28
  • 打赏
  • 举报
回复
利用反射!

package com;

import java.io.IOException;
import java.lang.reflect.Field;

public class Test {

public static void main(String[] args) throws IOException {
String userInfo = "userID=12,userName=Zhaomin";
String[] params = userInfo.split(",");
String[] fields = new String[params.length];
String[] values = new String[params.length];
for(int i = 0; i < params.length; i++){
String param = params[i];
String[] strs = param.split("=");
String field = null;
String value = null;
if(strs.length > 0){
field = strs[0];
}
if(strs.length > 1){
value = strs[1];
}
fields[i] = field;
values[i] = value;
}

Class<UserInfo> c = UserInfo.class;
UserInfo ui = null;
try {
ui = c.newInstance();
for(int i = 0; i < fields.length; i++){
String fieldName = fields[i];
String value = values[i];
// String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Field field = c.getDeclaredField(fieldName);
field.setAccessible(true);
if("int".equalsIgnoreCase(field.getType().toString())){
field.setInt(ui, Integer.parseInt(value));
}else if("long".equalsIgnoreCase(field.getType().toString())){
field.setLong(ui, Long.parseLong(value));
//基本类型自己去判断了
}else{
field.set(ui, field.getType().cast(value));
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
System.out.println(ui.getUserID() + " : " + ui.getUserName());
}

}

class UserInfo {
private int userID;
private String userName;

public UserInfo(){}

public int getUserID() {
return userID;
}

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

public String getUserName() {
return userName;
}

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

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧