我正在接收一个对象,需要对它进行记录。其中有些有垫子toString(),然后我想使用它,但是有些没有,我得到了类似mightypork.rogue.bus.events.MouseMotionEvent@2d19587d的东西。
我正在寻找一种动态的方法(也许是反射?)检查传入对象是否重写了toString()本身。
String objToString(Object o)
{
if(???) {
return o.toString();
} else {
// fallback method
return o.getClass().getSimpleName();
}
}附带说明:
它是一个事件总线系统,一些类可以订阅,然后根据实现的接口接收事件。我不可能要求所有客户端都有toString(),而且我还想使用这个方法来达到更多的目的。
发布于 2014-04-04 15:35:38
如果使用Object getClass()方法,则可以使用类并调用getMethod().getDeclaringClass()方法。如果它是Object,那么它不会被重写。不然的话,这条线上的某个地方就被夸大了。Source
发布于 2014-04-04 15:38:34
也许这有点傻,但你可以试试:
String objToString(Object o)
{
if(!(o.toString().contains("@" + o.hashCode()))) {
return o.toString();
} else {
// fallback method
return o.getClass().getSimpleName();
}
}或者类似于这个简化的版本:
String objToString(Object o) {
if (o.toString().equals(
o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()))) {
// fallback method
return o.getClass().getSimpleName();
} else {
return o.toString();
}
}发布于 2014-04-04 15:40:01
在这里检查对象中是否有toString方法:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TemplateHelper {
public static void main(String [] args){
int a = 3;
try {
objToString(a);
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void objToString(Object object) throws InvocationTargetException, IllegalArgumentException, IllegalAccessException{
Class c = object.getClass();
Method[] methods = c.getMethods();
for (Method method : methods) {
if(method.getName().equals("toString")){
System.out.println(method.getName()); //THERE IS toString in object
break;
}
}
}
}https://stackoverflow.com/questions/22866925
复制相似问题