首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测对象是否覆盖了toString()

检测对象是否覆盖了toString()
EN

Stack Overflow用户
提问于 2014-04-04 15:28:37
回答 4查看 4.3K关注 0票数 7

我正在接收一个对象,需要对它进行记录。其中有些有垫子toString(),然后我想使用它,但是有些没有,我得到了类似mightypork.rogue.bus.events.MouseMotionEvent@2d19587d的东西。

我正在寻找一种动态的方法(也许是反射?)检查传入对象是否重写了toString()本身。

代码语言:javascript
复制
String objToString(Object o)
{
    if(???) {
        return o.toString();
    } else {
        // fallback method
        return o.getClass().getSimpleName();
    }

}

附带说明:

它是一个事件总线系统,一些类可以订阅,然后根据实现的接口接收事件。我不可能要求所有客户端都有toString(),而且我还想使用这个方法来达到更多的目的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-04 15:35:38

如果使用Object getClass()方法,则可以使用类并调用getMethod().getDeclaringClass()方法。如果它是Object,那么它不会被重写。不然的话,这条线上的某个地方就被夸大了。Source

票数 16
EN

Stack Overflow用户

发布于 2014-04-04 15:38:34

也许这有点傻,但你可以试试:

代码语言:javascript
复制
    String objToString(Object o)
{
    if(!(o.toString().contains("@" + o.hashCode()))) {
        return o.toString();
    } else {
        // fallback method
        return o.getClass().getSimpleName();
    }

}

或者类似于这个简化的版本:

代码语言:javascript
复制
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();
  }
}
票数 1
EN

Stack Overflow用户

发布于 2014-04-04 15:40:01

在这里检查对象中是否有toString方法:

代码语言:javascript
复制
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;
            }
        }
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22866925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档