java 中不同对象间的属性复制怎么实现?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 中不同对象间的属性复制怎么实现?相关的知识,希望对你有一定的参考价值。

参考技术A 用get()和set()方法挨个赋值 参考技术B 这两个对象的属性名是一样的吗?追问

不一样。

追答

那就有点麻烦。
如果是一样的,很简单。如果不一样,那就需要你知道,将A类中A属性的值,赋给B类中那个属性。
一会给你一个属性名相同的例子.

追问

好的,谢谢~

追答

import java.lang.reflect.Field;

public class Test

public static void main(String[] args) throws Exception
A aClass = new A();
B bClass = new B();
aClass.name = "Test";
aClass.age = 20;

Field[] fields = aClass.getClass().getFields();
for (int i = 0; i < fields.length; i++)
String name = fields[i].getName();
Field field = bClass.getClass().getField(name);
field.set(bClass, fields[i].get(aClass));


System.out.println(bClass.name);
System.out.println(bClass.age);



class A
public String name = null;
public int age = 0;


class B
public String name = null;
public int age = 0;

本回答被提问者采纳

java 反射实现不同对象相同属性值复制

1、此方法会过滤final字段

2、此方法会过滤对象字段

3、此方法会兼容同对象之间、不同对象之间属性值复制

package com.bin.design.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.List;

import com.bin.design.domain.People;
import com.bin.design.domain.User;

public class Tools {
    /**
     * 对象相同属性copy
     * 
     * @param obj
     * @param toResult
     * @return
     * @throws Exception
     *             转换报错
     */
    public static <T> T cloneObj(Object obj, Class<T> toResult) {
        if (obj == null) {
            return null;
        }
        try {
            T t = toResult.newInstance();
            Field[] fields = toResult.getDeclaredFields();
            for (Field field : fields) {
                 field.setAccessible(true);//修改访问权限
                if (Modifier.isFinal(field.getModifiers()))
                    continue;
                if (isWrapType(field)) {
                    String firstLetter = field.getName().substring(0, 1).toUpperCase(); // 首字母大写
                    String getMethodName = "get" + firstLetter + field.getName().substring(1);
                    String setMethodName = "set" + firstLetter + field.getName().substring(1);
                    Method getMethod = obj.getClass().getMethod(getMethodName);   //从源对象获取get方法
                    Method setMethod = toResult.getMethod(setMethodName, new Class[] { field.getType() }); //从目标对象获取set方法
                    
                    //如果get 和 set方法都从一个对象中获取会出现object is not an instance of declaring class这个错误
                    //like: User{name} People{name} 
                    //因为如果从源对象中获取,在setMethod.invoke调用的时候,虽然名字相同,会由于类的不同,导致
                    //调用的方法却不是目标对象中应有的方法。实际就是:getMethod = com.package.User.getName();setMethod = com.package.User.setName();
                    //而setMethod.invoke调用的结果就变成 People.setName() == People.(com.package.User.setName())
                    //这里的setName却不是People该有的,so 报错了
                    //同理,如果从目标对象中获取,在getMethod.invoke调用的时候也会出错。
                    //因此,对于getMethod和setMethod的获取应该根据源对象和目标对象区别对待。
                    
                    //当然如果只是进行单独的对象复制,就不用担心会出现调用不属于本身的方法,也就不用区分对象get和set
                    
                    Object value = getMethod.invoke(obj); // get 获取的是源对象的值
                    setMethod.invoke(t, new Object[] { value }); // set 设置的是目标对象的值
                }
            }
            return t;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 是否是基本类型、包装类型、String类型
     */
    private static boolean isWrapType(Field field) {
        String[] types = { "java.lang.Integer", "java.lang.Double", "java.lang.Float", "java.lang.Long",
                "java.lang.Short", "java.lang.Byte", "java.lang.Boolean", "java.lang.Char", "java.lang.String", "int",
                "double", "long", "short", "byte", "boolean", "char", "float" };
        List<String> typeList = Arrays.asList(types);
        return typeList.contains(field.getType().getName()) ? true : false;
    }

    
    public static void main(String[] args) {
        User user = new User();
        user.setName("AAA");
        user.setPassword("vvv");
        System.out.println("1"+user.getName()+user.getPassword());
        
        People people =new People();
        System.out.println("2"+people.getName());
        
        User users = cloneObj(user,User.class);
        System.out.println("3"+users.getName());
        
        People p = cloneObj(user,People.class);
        System.out.println("4"+p.getName());
    }
}

 

以上是关于java 中不同对象间的属性复制怎么实现?的主要内容,如果未能解决你的问题,请参考以下文章

java 反射实现不同对象相同属性值复制

Java自定义copyProperties,实现不同对象的相同属性(包含子对象)赋值

Java自定义copyProperties,实现不同对象的相同属性(包含子对象)赋值

Java自定义copyProperties,实现不同对象的相同属性(包含子对象)赋值

利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

怎么给java对象添加动态添加属性和方法