只有一个Car@32c41a能得到原来的对象么?

plmko112233 2011-10-04 03:59:07
java只有一个Car@32c41a能得到原来的对象么?这是一个car 对象调用了tostring之后,能否得到原来的类,其实想得到原来类的各个域的信息,不知道怎么写
...全文
106 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
magong 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 plmko112233 的回复:]

Class<?> class1=Class.forName(ClassNameParm).newInstance();
if ( obj instanceof class1.getClass()) {
class1=(class1.getClass())obj;
}
[/Quote]
这样写:

//传入两个参数过来,obj是对象,classNameParam是类名
Class clazz=Class.forName(classNameParam);
if ( clazz.isInstance(obj)) {
Field[] fields = clazz.getDeclaredFields();
for(Field f: fields){ //打印对象各个字段值
f.setAccessible(true);
System.out.println(f.getName() + ":" +f.get(obj));
}
}
sudan_727923 2011-10-05
  • 打赏
  • 举报
回复
学习了
  • 打赏
  • 举报
回复
这是不可能还原的!

因此,建议自定义的需要重写 toString() 方法
plmko112233 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 magong 的回复:]

引用 6 楼 plmko112233 的回复:

是不是我还拥有这个Object的时候,如果没有tostring的话,还可以通过向下转型来得到具体对象?
如果这个对象的我也只知道名字,那可以得到么,如下:
Object o=args[i];
这里对象o是一个Car类,而当前是在另一个Test类下,那怎么向下转型,因为这个o对象是会变化的,在Test类下只能得到其方法名字,就是上面的“C……
[/Quote]
好吧,其实我说的有点问题,就是问题是,我要吧一个object的Car对象弄回来,强制转型的过程中,却只有edu.Car这个字符串,因为这个是参数,每次各不相同,想要获得object对象中的Car的信息,不知道怎么转型,或者怎么使用反射来达到目的,我知道的反射要得到field的值,也要传一个car对象的 ,转型做不了的话,还怎么得到所有的field信息呢,还是我哪里搞错了?
plmko112233 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 magong 的回复:]

引用 8 楼 plmko112233 的回复:

Class<?> class1=Class.forName(ClassNameParm).newInstance();
if ( obj instanceof class1.getClass()) {
class1=(class1.getClass())obj;
}

这样写:
Java code

//传入两个参数过来,obj……
[/Quote]
呵呵,是我自己搞错了,其实OBJECT对象直接可以去得到所有的field,就像你说的那样,我根本没必要去转成特定的类再去获取它的field,谢谢你回复,谢谢大家~~
plmko112233 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 magong 的回复:]

引用 6 楼 plmko112233 的回复:

是不是我还拥有这个Object的时候,如果没有tostring的话,还可以通过向下转型来得到具体对象?
如果这个对象的我也只知道名字,那可以得到么,如下:
Object o=args[i];
这里对象o是一个Car类,而当前是在另一个Test类下,那怎么向下转型,因为这个o对象是会变化的,在Test类下只能得到其方法名字,就是上面的“C……
[/Quote]
Class<?> class1=Class.forName(ClassNameParm).newInstance();
if ( obj instanceof class1.getClass()) {
class1=(class1.getClass())obj;
}
ClassNameParm是一个类的名字参数,是从别的方法得到的,所以只能反射得到,现在就是要得到这个类之后,把所有的field打印出来,上面代码写得好像挺别扭的,不知道怎么写了,请指教~
magong 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 plmko112233 的回复:]

是不是我还拥有这个Object的时候,如果没有tostring的话,还可以通过向下转型来得到具体对象?
如果这个对象的我也只知道名字,那可以得到么,如下:
Object o=args[i];
这里对象o是一个Car类,而当前是在另一个Test类下,那怎么向下转型,因为这个o对象是会变化的,在Test类下只能得到其方法名字,就是上面的“Car”字符串,怎么向下转型
[/Quote]
对的,只要没有toString,原对象还在,就能转。

Car car;
if (o instanceof Car) car = (Car)o;
//System.out.println(car.getName());
plmko112233 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 magong 的回复:]

嗯。
就像只知道人姓名不能克隆整个肉体一样,只知道toString之后的结果而不知道其他属性值当然无法还原对象。
[/Quote]
是不是我还拥有这个Object的时候,如果没有tostring的话,还可以通过向下转型来得到具体对象?
如果这个对象的我也只知道名字,那可以得到么,如下:
Object o=args[i];
这里对象o是一个Car类,而当前是在另一个Test类下,那怎么向下转型,因为这个o对象是会变化的,在Test类下只能得到其方法名字,就是上面的“Car”字符串,怎么向下转型?
plmko112233 2011-10-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qybao 的回复:]

可以得到原来的类,但是得不到原来的对象了
Car是代表类型,@是固定的,32c41a是对象的哈希值
要想通过这样的字符串还原是不可能的,已经丢失了各个属性的信息了
如果你只是想得到类的定义信息,那么可以通过反射
Java code
String s = "Car@32c41a";
s = s.relaceAll("(.*?)@.*", "$1");
Class<?> clazz = C……
[/Quote]
是不是我还拥有这个Object的时候,如果没有tostring的话,还可以通过向下转型来得到具体对象?
如果这个对象的我也只知道名字,那可以得到么,如下:
Object o=args[i];
这里对象o是一个Car类,而当前是在另一个Test类下,那怎么向下转型,因为这个o对象是会变化的,在Test类下只能得到其方法名字,就是上面的Car,怎么向下转型?
beowulf2005 2011-10-04
  • 打赏
  • 举报
回复
有办法,呵呵。

用jmap把内存dump出来。
再用jhat浏览查询dump 文件,把这个名为Car@32c41a的对象找出来。

然后就有你要的一切拉。。
magong 2011-10-04
  • 打赏
  • 举报
回复
不过楼主要是持有系统中所有对象的集合,那么只需要遍历一次,看看toString值是否匹配Car@32c41a,倒是可以找出到底是哪个对象的啦。
magong 2011-10-04
  • 打赏
  • 举报
回复
嗯。
就像只知道人姓名不能克隆整个肉体一样,只知道toString之后的结果而不知道其他属性值当然无法还原对象。
qybao 2011-10-04
  • 打赏
  • 举报
回复
可以得到原来的类,但是得不到原来的对象了
Car是代表类型,@是固定的,32c41a是对象的哈希值
要想通过这样的字符串还原是不可能的,已经丢失了各个属性的信息了
如果你只是想得到类的定义信息,那么可以通过反射
String s = "Car@32c41a";
s = s.relaceAll("(.*?)@.*", "$1");
Class<?> clazz = Class.forName(s);
Field[] fds = clazz.getDeclaredFields();
for (Field f : fds) {
System.out.println(f);
}

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧