java实体对象_java反射实体对象

原文:http://blog.csdn.net/qq_26525215

自己利用类反射来实现BeanUtils的功能。需要先学习类反射!

准备一个测试实体对象User类

public class User {

private String uuid;

private String name;

private int age;

public String getUuid() {

return uuid;

}

public void setUuid(String uuid) {

this.uuid = uuid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

User other = (User) obj;

if (uuid == null) {

if (other.uuid != null)

return false;

} else if (!uuid.equals(other.uuid))

return false;

return true;

}

@Override

public String toString() {

return "User [uuid=" + uuid + ", name=" + name + ", age=" + age + "]";

}

接着,需要定义实体反射的方法

public static Object populate(Class cls, Map map)

throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {

Object obj = null;

//1、用类反射new出对象

obj = cls.newInstance();

//2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置

//2.1遍历出所有该类声明的属性

Field flds[] = cls.getDeclaredFields();//getDeclaredFields()返回Class中所有的字段,包括私有字段;

for (Field fld: flds) {

String fldName = fld.getName();

//根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值

Object value = map.get(fldName);

if(value==null){//如果map中不存在对应的属性数据,我们在这里给出提示信息

System.out.println(fldName+"的数据为空");

}else{

//如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字

String mothodName = "set"+fldName.substring(0, 1).toUpperCase()+fldName.substring(1);

//根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象

Class paramTypes[] = new Class[1];

paramTypes[0] = fld.getType();

Method method = cls.getDeclaredMethod(mothodName, paramTypes);

//调用该method对象所代表的方法

Object args[] = new Object[1];

args[0]=value;

method.invoke(obj, args);

}

}

return obj;

}

单元测试

@Test

public void test()

{

Map map = new HashMap();

map.put("uuid","001");

map.put("name","你好");

map.put("age",20);

try {

User user = (User)MyBeanUtils.populate(User.class,map);

System.out.println(user.toString());

} catch (Exception e) {

e.printStackTrace();

}

}

会发现,每次调用时都需要进行实体转换,接下来进行改进。

public static T populate(Class cls, Map map)

throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {

T obj = null;

//1、用类反射new出对象

obj = cls.newInstance();

//2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置

//2.1遍历出所有该类声明的属性

Field flds[] = cls.getDeclaredFields();//getDeclaredFields()返回Class中所有的字段,包括私有字段;

for (Field fld : flds) {

String fldName = fld.getName();

//根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值

Object value = map.get(fldName);

if (value == null) {//如果map中不存在对应的属性数据,我们在这里给出提示信息

System.out.println(fldName + "的数据为空");

} else {

//如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字

String mothodName = "set" + fldName.substring(0, 1).toUpperCase() + fldName.substring(1);

//根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象

Class> paramTypes[] = new Class[1];

paramTypes[0] = fld.getType();

Method method = cls.getDeclaredMethod(mothodName, paramTypes);

//调用该method对象所代表的方法

Object args[] = new Object[1];

args[0] = value;

method.invoke(obj, args);

}

}

return obj;

}

单元测试

@Test

public void test()

{

Map map = new HashMap();

map.put("uuid","001");

map.put("name","你好");

map.put("age",20);

try {

User user = MyBeanUtils.populate(User.class,map);

System.out.println(user.toString());

} catch (Exception e) {

e.printStackTrace();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值