当前位置:编程学习 > JAVA >>

关于未知对象转型的问题

有这样一个需求:
我有一个公用的方法public void buildObject(Object obj),接收参数是一个Object对象。其他类会调用此方法,比如客户类new了一个Person并set了一系列属性值,调用buildObject方法后传入person。

这时候buildObject接收过来,但是并不知道对方传入的是何种对象,请问在这样的情况下,有什么办法能够将object对象转换为它本身的类型,并get到属性值?谢谢~ 能附上解决思路也行:) --------------------编程问答-------------------- 思想有问题,你不可能去处理一个完全未知的东西 --------------------编程问答-------------------- 不能再加个参数啊??public void buildObject(Object obj,String type){
if(type.equals("person")){
Person p = (Person)obj;
}

} --------------------编程问答-------------------- 为什么不用泛型呢? --------------------编程问答-------------------- 多一个Class传递过来怎么样?这样类型、方法都能找到了。 --------------------编程问答--------------------
引用 楼主 xiqinyy 的回复:
有这样一个需求:
我有一个公用的方法public void buildObject(Object obj),接收参数是一个Object对象。其他类会调用此方法,比如客户类new了一个Person并set了一系列属性值,调用buildObject方法后传入person。

这时候buildObject接收过来,但是并不知道对方传入的是何种对象,请问在这样的情况下,有什么办法能够将object对象转换为它本身的类型,并get到属性值?谢谢~ 能附上解决思路也行:)


反射一下,你就知道! --------------------编程问答-------------------- 可以用instanceof 判断一下
看这个方法是个普通方法 不是静态的
就是定义在需要用到的类中就可以
如果不是本类类型 return 就好了

是的话 就可以强制转换了!!!
--------------------编程问答--------------------
引用
引用 楼主 xiqinyy 的回复:
有这样一个需求: 我有一个公用的方法public void buildObject(Object obj),接收参数是一个Object对象。其他类会调用此方法,比如客户类new了一个Person并set了一系列属性值,调用buildObject方法后传入person。  这时候buildObject接收过来,但是并不知道对方传入的是何种对象,请问在这样的情况下,有什么办法能够将object对象转换为它本身的类型,并get到属性值?谢谢~ 能附上解决思路也行:)


反射一下,你就知道! 
到这方法都成Object 你对Object进行反射? --------------------编程问答--------------------
引用 7 楼 tlfu_12344 的回复:
引用
引用 楼主 xiqinyy 的回复:
有这样一个需求: 我有一个公用的方法public void buildObject(Object obj),接收参数是一个Object对象。其他类会调用此方法,比如客户类new了一个Person并set了一系列属性值,调用buildObject方法后传入person。  这时候buildObject接收过来,但是并不知道对方传入的是何种对象,请问在这样的情况下,有什么办法能够将object对象转换为它本身的类型,并get到属性值?谢谢~ 能附上解决思路也行:)


反射一下,你就知道! 
到这方法都成Object 你对Object进行反射?


这里楼主说的是他对于方法传递过来的对象的实际类型不知道,
反射的使用就是找出对象的实际类型嘛,
我想楼主想说的是这样:
如何将这个对象cast成实际的对象
()object,假设反射得到的类型信息为classtype(字符串)
我们不能就这样 (classtype)object来强转

--------------------编程问答--------------------
引用 2 楼 tlfu_12344 的回复:
不能再加个参数啊??public void buildObject(Object obj,String type){
if(type.equals("person")){
Person p = (Person)obj;
}

}


引用 6 楼 wandefajin 的回复:
可以用instanceof 判断一下
看这个方法是个普通方法 不是静态的
就是定义在需要用到的类中就可以
如果不是本类类型 return 就好了

是的话 就可以强制转换了!!!

2种正解的方法。 --------------------编程问答-------------------- 把你的Object类型搞成个接口或者抽象类,
AbstractPeople{
  void eat();
}
以下的啥子People1,People2这些作为子类实现该方法.
则在你通过buildObj得到对象的时候,你不需要关系它的类型是什么,只需要调用eat方法,它会自己根据自己的类型去寻找相应的是People1还是People2中的eat方法(其实这个就是java的多态)

你如果实在要转型可以这样
if (obj instanceof People1) {
People1 b2 = (People1) obj;
}
其实这就是一个典型向下转型。
--------------------编程问答-------------------- 我建议用反射的的思路,先附上代码吧:
public void buildObject(Object object) {
try {
// 获取该对象所属的类的字节码
Class clazz = object.getClass();
// 获得该类所有的方法
Method[] methods = clazz.getMethods();
// 遍历所有的方法
for (Method method : methods) {
String methodName = method.getName();
// 判断如果方法名以"get"开始,就调用该方法
if (methodName.startsWith("get")
&& !methodName.equals("getClass")) {
Object obj = method.invoke(object);
System.out.println(obj);
}
}
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
}

具体的思路是:Object#getClass()获得给对象所属的类---->Class#getMethods()获得该类所有的方法,当然
也会获得超类的所有方法,让后遍历所有的方法,根据方法名去判断回调get方法,当然也会调用getClass方法,在这里可以手动控制一下。
谢谢楼主的提问!
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,