利用反射原理用get/set方法设置属性(也可用clone,但如果有特殊处理的东西,这个好用)
2017-07-19 18:16
375 查看
先创建一个POJO,如User,里面所有属性都用get/set方法,假设original是User的一个实例对象,已经设置了各种属性,现在要把属性赋值到新对象里去。
public User testCopy(User original){
User copy=new User();
Class<User> cla=(Class<User>) original.getClass();
Method[] ffs=cla.getDeclaredMethods();//获取所有声明的方法,不包含父类里的方法
for (Method method : ffs) {
//如果有需要特殊处理的可以这样写
if(method.toString().contains(".getBjs()")){
//处理过程
continue;
}
if(method.toString().contains(".get")){//获取get方法
Object obj=method.invoke(original, null);//获取调用get方法后获得的对象
if(obj!=null){
Class[] cls=new Class[]{obj.getClass()};//返回值类型数组,后面调用对应set方法时要用此类型对应的参数类型
String str=method.toString();
int start=str.indexOf(".get");
str=str.substring(start, str.length());
String setmethod=str.replace(".get", "set").replace("()", "");//处理含包名、类名、方法名及括号的get方法,变成只有方法名且没有括号的set方法
Method m=cla.getDeclaredMethod(setmethod,cls);//set方法的参数类型和get方法的返回值类型对应
m.invoke(copy, obj);//调用set方法设置值
}
}
}
return copy;
}
public User testCopy(User original){
User copy=new User();
Class<User> cla=(Class<User>) original.getClass();
Method[] ffs=cla.getDeclaredMethods();//获取所有声明的方法,不包含父类里的方法
for (Method method : ffs) {
//如果有需要特殊处理的可以这样写
if(method.toString().contains(".getBjs()")){
//处理过程
continue;
}
if(method.toString().contains(".get")){//获取get方法
Object obj=method.invoke(original, null);//获取调用get方法后获得的对象
if(obj!=null){
Class[] cls=new Class[]{obj.getClass()};//返回值类型数组,后面调用对应set方法时要用此类型对应的参数类型
String str=method.toString();
int start=str.indexOf(".get");
str=str.substring(start, str.length());
String setmethod=str.replace(".get", "set").replace("()", "");//处理含包名、类名、方法名及括号的get方法,变成只有方法名且没有括号的set方法
Method m=cla.getDeclaredMethod(setmethod,cls);//set方法的参数类型和get方法的返回值类型对应
m.invoke(copy, obj);//调用set方法设置值
}
}
}
return copy;
}
相关文章推荐
- java将属性设置为私有,在给其添加get/set方法和直接把属性设置成public有什么区别
- 【封装】java中为什么要将属性进行私有化,又使用set和get方法来设置和获取属性呢?
- PHP中的__get()和__set()方法获取设置私有属性
- 利用属性名称配置,自动转换成java bean对象的set、get方法的方法
- 利用反射对私有属性/方法进行设置/调用
- java中不利用get方法获得私有属性、不利用set方法修改私有属性、通过执行私有方法getName获得私有属性、通过执行私有方法setName更改私有属性name的值
- Python3基础 描述符类与自制property方法 __get__,__set__,__delete__方法 讲一个特殊的类的实例指派给另一个类的属性
- __set($key,$values) 和__get($varName) 魔术方法设置读取私有属性
- Java反射实体类属性(get ,set方法)
- java 私有属性加get/set方法跟直接把属性设置成public有区别吗?
- 利用反射对私有属性/方法进行设置/调用(转自己贴)
- Java反射:根据属性名得到其Set方法设置它的值
- Spring 配置bean, 注解方式配置 xml方式要生产set方法方便属性注入,注解方式不需要,利用反射机制注入
- 【Unity&人物属性】人物属性大量设置用set,get方法还是public成员
- Java反射实体类属性(get ,set方法)
- 添加C# ProtoGen List set方法 ,使用反射设置属性的值
- Java---通过属性名反射获取get和set方法
- PHP中的__get()和__set()方法获取设置私有属性
- java类中为什么设置set和get方法操作属性
- 利用反射机制,将ResultSet处理为bean或list的方法