对象的类不知道,里面属性的类型也不知道。我感觉我没救了
问题补充:
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接口