• 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接口
  • 相关阅读:
    数据库备份 DBS(Database Backup),知识点
    关系型数据库 RDS(Relational Database Service),知识点
    对象存储服务 OSS(Object Storage Service),知识点(待补充上仓库代码)
    Java 为什么需要包装类,如何使用包装类?
    for each 语句
    缓存中,2个注解:@cacheable 与 @cacheput 的区别
    微信小程序,相关代码
    微信小程序中的事件
    通俗易懂:索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系
    MySQL 的各种 join
  • 原文地址:https://www.cnblogs.com/huapox/p/3516095.html
Copyright © 2020-2023  润新知