当前位置:编程学习 > JAVA >>

一个关于java反射的深层对象映射的问题 ----高分跪求、在线等、



将对象A的id、name复制给对象C的id、name 
将对象A中的对象C的id、name 复制给对象A中的对象D的id、name
java 对象 反射 --------------------编程问答-------------------- 这和反射有啥关系呢? --------------------编程问答-------------------- 到底是什么样一个需求会有这样的要求。层次是定的么,或者说id,name这些属性的对应方式是固定的还是说不固定 --------------------编程问答-------------------- A---B
C---D 中的属性和字段都是对应的  
--------------------编程问答--------------------
引用 1 楼 fangmingshijie 的回复:
这和反射有啥关系呢?
你有什么好办法将A对象中的内容给B???? --------------------编程问答--------------------
引用 2 楼 abstruct 的回复:
到底是什么样一个需求会有这样的要求。层次是定的么,或者说id,name这些属性的对应方式是固定的还是说不固定
需求很变态,但项目已经开动不短时间了,现在必须要解决这个问题 --------------------编程问答-------------------- 通过映射获取两个对象属性集合,两个对象循环对比属性名和属性类型 如果符合就赋值过去 --------------------编程问答--------------------
引用 6 楼 oOrayOo 的回复:
通过映射获取两个对象属性集合,两个对象循环对比属性名和属性类型 如果符合就赋值过去

反射 --------------------编程问答-------------------- BeanUtils工具类的copyProperties就能解决了。 --------------------编程问答-------------------- 你这个问题的描述太不清晰了,如果有明确的对应关系,那么可以直接类赋值过去就行了,完全没有反射的必要吧?如果是不确定的类对象和属性名,那么是可以使用反射,通过反射的可以获取该类中声明的属性,并赋值过去,如果该属性还有get和set方法,也可以通过调取方法进行赋值,话说这也不是什么太困难的事情,不知道说的是否符合你的要求,你最好再把问题描述更清晰一些 --------------------编程问答-------------------- 这样的类型的?

public class Test2 {
public static void main(String[] args) throws Exception {
A a = new A();
Field[] fa = a.getClass().getFields();

Field[] fc = Class.forName("c").getFields();


for (Field f : fa) {
for (Field ff : fc) {
if (ff.getName().equals(f.getName())) {
ff.setAccessible(true);
ff.set(a.c, f.get(a));
}
}
}
}
}
class A{
C c;
}
class C{

}
--------------------编程问答-------------------- 这个你看看行不行

public class Client {

public static List<Bean> list = new ArrayList<Bean>();

static{
Bean b1 = new Bean("id", "id");
Bean b2 = new Bean("name", "name");
Bean b3 = new Bean("newAge", "age");
Bean b4 = new Bean("email", "newEmail");
list.add(b1);
list.add(b2);
list.add(b3);
list.add(b4);
}

public static void main(String[] args) throws Exception{
A a = new A();
a.setId(1l);
a.setName("json");
a.setNewAge(11);
a.setEmail("aa@163.com");
B b = new B();
cloneObj(list, a, b);
System.out.println(b.getId() + "--" + b.getName() + "--" + b.getAge() + "--" + b.getNewEmail());
}

private static void cloneObj(List<Bean> params, Object a, Object b){
Class<?> classA = a.getClass();
Class<?> classB = b.getClass();

for(Bean bean : params){
String srcFieldName = bean.getSrcField();
String distFieldName = bean.getDistField();
try {
Field srcField = classA.getDeclaredField(srcFieldName);
Field distField = classB.getDeclaredField(distFieldName);
Class<?> srcType = srcField.getType();
Class<?> distType = distField.getType();
if(srcType == distType){
String srcGetMethodName = "get" + srcFieldName.substring(0, 1).toUpperCase() + srcFieldName.substring(1);
String distSetMethodName = "set" + distFieldName.substring(0, 1).toUpperCase() + distFieldName.substring(1);
Method getSrcMethod = classA.getMethod(srcGetMethodName, new Class[]{});
Method setDistMethod = classB.getMethod(distSetMethodName, new Class[]{distType});
setDistMethod.invoke(b, getSrcMethod.invoke(a, new Object[]{}));
}
} catch (Exception e) {
//e.printStackTrace();
}
}
}

}
class A{
private Long id;
private String name;
private Integer newAge;
private String email;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNewAge() {
return newAge;
}
public void setNewAge(Integer newAge) {
this.newAge = newAge;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
class B{
private Long id;
private String name;
private Integer age;
private String newEmail;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getNewEmail() {
return newEmail;
}
public void setNewEmail(String newEmail) {
this.newEmail = newEmail;
}
}
class Bean{
private String srcField;
private String distField;
public Bean(String srcField, String distField){
this.srcField = srcField;
this.distField = distField;
}

public String getSrcField() {
return srcField;
}
public void setSrcField(String srcField) {
this.srcField = srcField;
}
public String getDistField() {
return distField;
}
public void setDistField(String distField) {
this.distField = distField;
}
}
--------------------编程问答-------------------- Class<?> srcType = srcField.getType();
                Class<?> distType = distField.getType();
                if(srcType == distType){
                    String srcGetMethodName = "get" + srcFieldName.substring(0, 1).toUpperCase() + srcFieldName.substring(1);
                    String distSetMethodName = "set" + distFieldName.substring(0, 1).toUpperCase() + distFieldName.substring(1);
                    Method getSrcMethod = classA.getMethod(srcGetMethodName, new Class[]{});
                    Method setDistMethod = classB.getMethod(distSetMethodName, new Class[]{distType});
                    setDistMethod.invoke(b, getSrcMethod.invoke(a, new Object[]{}));
                }
这个只能复制普通的属性,A类中的对象属性无法复制 --------------------编程问答--------------------
引用 10 楼 AA5279AA 的回复:
这样的类型的?

public class Test2 {
public static void main(String[] args) throws Exception {
A a = new A();
Field[] fa = a.getClass().getFields();

Field[] fc = Class.forName("c").getFields();


for (Field f : fa) {
for (Field ff : fc) {
if (ff.getName().equals(f.getName())) {
ff.setAccessible(true);
ff.set(a.c, f.get(a));
}
}
}
}
}
class A{
C c;
}
class C{

}
  你这个只是把A的值给C与问题描述不符   --------------------编程问答--------------------
引用 8 楼 fangmingshijie 的回复:
BeanUtils工具类的copyProperties就能解决了。

BeanUtils 只能解决
A
  C
B
  C
这种情况 --------------------编程问答--------------------

public class Client {

public static List<Bean> list = new ArrayList<Bean>();

static{
Bean b1 = new Bean("id", "id");
Bean b2 = new Bean("name", "name");
Bean b3 = new Bean("newAge", "age");
Bean b4 = new Bean("email", "newEmail");
Bean b5 = new Bean("c", "d");
list.add(b1);
list.add(b2);
list.add(b3);
list.add(b4);
list.add(b5);
}

public static void main(String[] args) throws Exception{
A a = new A();
a.setId(1l);
a.setName("json");
a.setNewAge(11);
a.setEmail("aa@163.com");
C c = new C();
c.setId(1000l);
a.setC(c);
B b = new B();
cloneObj(list, a, b);
System.out.println(b.getId() + "--" + b.getName() + "--" + b.getAge() + "--" + b.getNewEmail() + "[c:" + b.getD().getId() + "]");
}

private static void cloneObj(List<Bean> params, Object a, Object b){
Class<?> classA = a.getClass();
Class<?> classB = b.getClass();

for(Bean bean : params){
String srcFieldName = bean.getSrcField();
String distFieldName = bean.getDistField();
try {
Field srcField = classA.getDeclaredField(srcFieldName);
Field distField = classB.getDeclaredField(distFieldName);
Class<?> srcType = srcField.getType();
Class<?> distType = distField.getType();
// 都不是基本类型,如果都不是java包下的
String srcGetMethodName = "get" + srcFieldName.substring(0, 1).toUpperCase() + srcFieldName.substring(1);
String distSetMethodName = "set" + distFieldName.substring(0, 1).toUpperCase() + distFieldName.substring(1);
Method setDistMethod = classB.getMethod(distSetMethodName, new Class[]{distType});
Method getSrcMethod = classA.getMethod(srcGetMethodName, new Class[]{});
Object srcObj = getSrcMethod.invoke(a, new Object[]{});
if(!srcType.isPrimitive() && !distType.isPrimitive() && !srcType.getName().startsWith("java.lang") && !distType.getName().startsWith("java.")){
Object distObj = distType.newInstance();
cloneObj(params, srcObj, distObj);
setDistMethod.invoke(b, distObj);
}else{
setDistMethod.invoke(b, srcObj);
}
} catch (Exception e) {
//e.printStackTrace();
}
}
}

}
class C{
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
class D{
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
class A{
private Long id;
private String name;
private Integer newAge;
private String email;
private C c;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNewAge() {
return newAge;
}
public void setNewAge(Integer newAge) {
this.newAge = newAge;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public C getC() {
return c;
}
public void setC(C c) {
this.c = c;
}
}
class B{
private Long id;
private String name;
private Integer age;
private String newEmail;
private D d;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getNewEmail() {
return newEmail;
}
public void setNewEmail(String newEmail) {
this.newEmail = newEmail;
}
public D getD() {
return d;
}
public void setD(D d) {
this.d = d;
}
}
class Bean{
private String srcField;
private String distField;
public Bean(String srcField, String distField){
this.srcField = srcField;
this.distField = distField;
}

public String getSrcField() {
return srcField;
}
public void setSrcField(String srcField) {
this.srcField = srcField;
}
public String getDistField() {
return distField;
}
public void setDistField(String distField) {
this.distField = distField;
}
}
--------------------编程问答-------------------- 要做深层反射,只能递归+循环来搞了。 --------------------编程问答--------------------
引用 9 楼 zzqangel 的回复:
你这个问题的描述太不清晰了,如果有明确的对应关系,那么可以直接类赋值过去就行了,完全没有反射的必要吧?如果是不确定的类对象和属性名,那么是可以使用反射,通过反射的可以获取该类中声明的属性,并赋值过去,如果该属性还有get和set方法,也可以通过调取方法进行赋值,话说这也不是什么太困难的事情,不知道说的是否符合你的要求,你最好再把问题描述更清晰一些


get、set方法都有
需求就是  【将对象A的id、name复制给对象C的id、name 
将对象A中的对象C的id、name 复制给对象A中的对象D的id、name】
A、B、C、D都是泛指 即代表所有自定义对象
--------------------编程问答--------------------
引用 16 楼 fengmy11 的回复:
要做深层反射,只能递归+循环来搞了。
   
跪求指教,能不能写个dome来看看  若是好用我还可以追加积分!!! --------------------编程问答-------------------- BeanUtils.copyProperties足够解决了
BeanUtils.copyProperties(A.d,A.c);A中的c赋值给A中的d
BeanUtils.copyProperties(C,A);A对象赋值给C对象 --------------------编程问答--------------------
引用 19 楼 suciver 的回复:
BeanUtils.copyProperties足够解决了
BeanUtils.copyProperties(A.d,A.c);A中的c赋值给A中的d
BeanUtils.copyProperties(C,A);A对象赋值给C对象
当前的问题是结局了    但是问题是A中的对象不止C 可能还会有其他的对象,而且像A转B这种转换的情况比较多,退好是能提供一个工具类,我提供对象A,就能给我返回对象B --------------------编程问答--------------------
引用 20 楼 qingxinwudao 的回复:
Quote: 引用 19 楼 suciver 的回复:

BeanUtils.copyProperties足够解决了
BeanUtils.copyProperties(A.d,A.c);A中的c赋值给A中的d
BeanUtils.copyProperties(C,A);A对象赋值给C对象
当前的问题是结局了    但是问题是A中的对象不止C 可能还会有其他的对象,而且像A转B这种转换的情况比较多,退好是能提供一个工具类,我提供对象A,就能给我返回对象B

A中对象不止C那你是要怎么个赋值,是要把A.c全部赋值给A中其它的对象吗?。A转B这个BeanUtils.copyProperties(B,A);直接就能解决了啊。copyProperties就是将原对象中与目标对象中属性名相同的属性赋值 --------------------编程问答--------------------
引用 18 楼 qingxinwudao 的回复:
Quote: 引用 16 楼 fengmy11 的回复:

要做深层反射,只能递归+循环来搞了。
   
跪求指教,能不能写个dome来看看  若是好用我还可以追加积分!!!

上面写了个新的,你都不看一下哇.....那个可以深层次的设置对象的属性。 --------------------编程问答--------------------
引用 17 楼 qingxinwudao 的回复:
Quote: 引用 9 楼 zzqangel 的回复:

你这个问题的描述太不清晰了,如果有明确的对应关系,那么可以直接类赋值过去就行了,完全没有反射的必要吧?如果是不确定的类对象和属性名,那么是可以使用反射,通过反射的可以获取该类中声明的属性,并赋值过去,如果该属性还有get和set方法,也可以通过调取方法进行赋值,话说这也不是什么太困难的事情,不知道说的是否符合你的要求,你最好再把问题描述更清晰一些


get、set方法都有
需求就是  【将对象A的id、name复制给对象C的id、name 
将对象A中的对象C的id、name 复制给对象A中的对象D的id、name】
A、B、C、D都是泛指 即代表所有自定义对象

你的A中没有D的引用啊?B中才有D啊?
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,