java中如何取到一个对象的所有属性值,并且在创建一个相同的对象

对象的类不知道,里面属性的类型也不知道。我感觉我没救了
 
问题补充:
udvs 写道
都有对象了,为什么不知道对象的类呢? 
 
用反射机制吧,很轻松!
 
 
 
比如说:只知道对象a,问你要a里面所有属性值
 
问题补充:
udvs 写道
a.getClass().getDeclaredFields()
 
哥们,我要的是值,不是属性名,而且是私有的成员,公有的我能得到
 
问题补充:
izhangh 写道
Java代码  
public static Object deepClone(Object obj) {  
    try {  
        ByteArrayOutputStream bo = new ByteArrayOutputStream();  
        ObjectOutputStream oo = new ObjectOutputStream(bo);  
        oo.writeObject(obj);  
        // 从流里读回来  
        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());  
        ObjectInputStream oi = new ObjectInputStream(bi);  
        return (oi.readObject());  
    }  
       catch(Exception e) {  
    }  
       return obj;  
}  
 
不得不承认你是玩流高手这都想得到,但是回的还是原来的对象啊,对象里面的私有属性值还是得不到啊
 
问题补充:
zhanghaiyangruijie 写道
这个用反射有点浪费了。。不知道这样能不能解决这个兄弟的问题
Java代码  
package com.zhy.test.prototype;  
public class TestClone {     
    
    /** 原型模式  
     * @param args   
     */    
    
    public static void main(String[] args) {     
        try {     
            new TestClone().cloneObject();     
        } catch (CloneNotSupportedException e) {     
            e.printStackTrace();     
        }     
    }     
    
    public void cloneObject() throws CloneNotSupportedException {     
        Person p = new Person();     
        Man man = new Man();     
        man.setSalory("111123");     
        p.setName("zhangfei");     
        p.setMan(man);     
        //man.setSalory("122335");//(1)     
        Person pp = p.getClonePerson(p);     
        man.setSalory("122335");//(2)     
        pp.setName("aa");     
        System.out.println("pp.getName()= " + pp.getName() + " pp.man.getSalory()= "+pp.getMan().getSalory());     
        System.out.println("p.getName()=" + p.getName()+" p.man.getSalory()= "+p.getMan().getSalory());     
    }     
}     
    
class Person implements Cloneable {     
    private String name = "";     
    private Man man;     
         
    public String getName() {     
        return name;     
    }     
    
    public void setName(String name) {     
        this.name = name;     
    }     
    
    
    public Person getClonePerson(Person p) throws CloneNotSupportedException {     
        Person pp = (Person) p.clone();     
        return pp;     
    }     
    
    public Man getMan() {     
        return man;     
    }     
    
    public void setMan(Man man) {     
        this.man = man;     
    }     
         
    public Object clone() throws CloneNotSupportedException{     
        Person p = (Person) super.clone();     
        p.man = this.getMan().getCloneMan(this.getMan());     
        return p;     
    }     
}     
    
class Man implements Cloneable{     
    private String salory = "";     
    
    public String getSalory() {     
        return salory;     
    }     
    
    public void setSalory(String salory) {     
        this.salory = salory;     
    }      
    public Man getCloneMan(Man man) throws CloneNotSupportedException{     
        Man ma = (Man)man.clone();     
        return ma;     
    }     
}    
 
见解独到,但是有违提议,可以鼓励鼓励
 
问题补充:
ouchxp 写道
新手.....虽然昨天我也是.....
这段代码你可以执行一下试试. 
Java代码  
import java.lang.reflect.Field;  
import java.lang.reflect.Modifier;  
import sun.misc.Unsafe;  
public class TestClass {  
    private String name;  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public static void main(String[] args) throws Exception {  
  
        TestClass tc = new TestClass();  
        tc.setName("oUCHxP");  
        //现在是一个未知类型的对象(模拟一下)  
        Object obj = tc;  
  
        //获取对象类型,可以看到输出是TestClass类型  
        Class c = obj.getClass();  
        System.out.println(c);  
  
        //创建此类型的空对象  
        Field fu = Unsafe.class.getDeclaredField("theUnsafe");  
        fu.setAccessible(true);  
        Unsafe us = (Unsafe) fu.get(null);  
        Object newObj = us.allocateInstance(c);  
  
        //可以看到name是空的  
        System.out.println("newObj.name: " + ((TestClass) newObj).getName());  
  
        //获取所有成员(包括private)的值,并拷贝到新对象中  
        Field[] fields = c.getDeclaredFields();  
        for (Field f : fields) {  
            //不拷贝static成员和final成员  
            if (Modifier.isStatic(f.getModifiers()) || Modifier.isFinal(f.getModifiers())) {  
                continue;  
            }  
            f.setAccessible(true);  
            Object fieldValue = f.get(obj);  
            f.set(newObj, fieldValue);  
        }  
  
        //再看一下新对象里的内容,private成员也被复制过来了  
        System.out.println("newObj.name: " + ((TestClass) newObj).getName());  
    }  
}  
 
 
果然是老鸟,让你猜着了,但是呢,我也是本着不用反射来解题的。所以请各位再想想办法来解决这难题。
 
问题补充:
ouchxp 写道
zhanghaiyangruijie 写道
这个用反射有点浪费了。。不知道这样能不能解决这个兄弟的问题..
 
lz 写道
对象的类不知道,里面属性的类型也不知道。
 
未必实现了Cloneable接口
原文地址:https://www.cnblogs.com/huapox/p/3516095.html