java 映射问题,求解答

Braska 2016-10-09 11:06:55

package test.reflect;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class BeanUtil {

public static Map<String, Object> getBeanValue(Object obj, Class<?> clazz, String[] getFields) throws Exception{
if(getFields == null || getFields.length <= 0) return null;
Map<String, Object> map = new HashMap<String, Object>();
Field[] fields = clazz.getDeclaredFields();
if(fields != null && fields.length > 0){
for(String getField : getFields){
for(Field field : fields){
if(field.getName().equals(getField)){
PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
clazz);
Method method = pd.getReadMethod();
Object object = method.invoke(obj, null);
if(object != null){
map.put(getField, object);
}
}
}
}
}

return map;
}

public static void main(String[] args) {
User user = new User();
user.setsName("test");
user.setPassword("123456");
user.setOnline(false);
user.setAddTime(new Date());
try {
//Map<String, Object> map = BeanUtil.getBeanValue(user, User.class, new String[]{"password", "addTime"});
Map<String, Object> map = BeanUtil.getBeanValue(user, User.class, new String[]{"sName", "password", "isOnline", "addTime"});
if(map != null) System.out.println(map.toString());
} catch (Exception e) {
e.printStackTrace();
}
}

}


class User {

private String sName;
private boolean isOnline;
private String password;
private Date addTime;
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public boolean isOnline() {
return isOnline;
}
public void setOnline(boolean isOnline) {
this.isOnline = isOnline;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getAddTime() {
return addTime;
}
public void setAddTime(Date addTime) {
this.addTime = addTime;
}

}



java.beans.IntrospectionException: Method not found: isSName
at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:106)
at java.beans.PropertyDescriptor.<init>(PropertyDescriptor.java:70)
at test.reflect.BeanUtil.getBeanValue(BeanUtil.java:20)
at test.reflect.BeanUtil.main(BeanUtil.java:43)



PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
clazz);
这个方法 好像获取不到isOnline和sName的getter/setter方法。
user类的getter/setter都是自动生成的。
...全文
164 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Braska 2016-10-09
  • 打赏
  • 举报
回复
引用 3 楼 qnmdcsdn 的回复:
好吧,看来只能自己写getter/setter方法。 网上找了下javabean命名规范: 1. javabean属性命名尽量使用常规的驼峰式命名规则 2. 属性名第一个单词尽量避免使用一个字母:如eBook, eMail。 3. boolean属性名避免使用 “is” 开头的名称。 谢谢了。
  • 打赏
  • 举报
回复
引用 2 楼 Ragin 的回复:
[quote=引用 1 楼 qnmdcsdn 的回复:] 命名规范,换成name试试
这个命名符合驼峰命名吧,而且isOnline那个也会报错。[/quote]

package test;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class test5 {
	public static Map<String, Object> getBeanValue(Object obj, Class<?> clazz, String[] getFields) throws Exception{
        if(getFields == null || getFields.length <= 0) return null;
        Map<String, Object> map = new HashMap<String, Object>();
        Field[] fields = clazz.getDeclaredFields();
        if(fields != null && fields.length > 0){
            for(String getField : getFields){
                for(Field field : fields){
                    if(field.getName().equals(getField)){
                        PropertyDescriptor pd = new PropertyDescriptor(field.getName(),  
                                clazz);
                        Method method = pd.getReadMethod();
                        Object object = method.invoke(obj, null);
                        if(object != null){
                            map.put(getField, object);
                        }
                    }
                }
            }
        }
         
        return map;
    }
     
    public static void main(String[] args) {
        User user = new User();
        user.setSName("test");
        user.setPassword("123456");
        user.setIsOnline(false);
        user.setAddTime(new Date());
        try {
            //Map<String, Object> map = BeanUtil.getBeanValue(user, User.class, new String[]{"password", "addTime"});
            Map<String, Object> map = test5.getBeanValue(user, User.class, new String[]{"sName", "password", "isOnline", "addTime"});
            if(map != null) System.out.println(map.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}
 
class User {
    private String sName;
    private boolean isOnline;
    private String password;
    private Date addTime;
    public String getSName() {
        return sName;
    }
    public void setSName(String sName) {
        this.sName = sName;
    }
    public boolean getIsOnline() {
        return isOnline;
    }
    public void setIsOnline(boolean isOnline) {
        this.isOnline = isOnline;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Date getAddTime() {
        return addTime;
    }
    public void setAddTime(Date addTime) {
        this.addTime = addTime;
    }
}

Braska 2016-10-09
  • 打赏
  • 举报
回复
引用 1 楼 qnmdcsdn 的回复:
命名规范,换成name试试
这个命名符合驼峰命名吧,而且isOnline那个也会报错。
  • 打赏
  • 举报
回复
命名规范,换成name试试

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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