gpt4 book ai didi

java - 如何判断一个对象是否实现了类似 toString() 的方法?

转载 作者:行者123 更新时间:2023-11-30 10:56:01 24 4
gpt4 key购买 nike

我正在编写一个测试库,我希望能够处理可能没有提供它们自己的 String toString() 实现的对象。

在那些情况下,我更愿意使用 Apache Commons-Lang ToStringBuilder 而不是使用无用的默认实现相反......但宁愿使用对象的 toString() 实现(如果可用)。

我如何判断一个对象是否具有默认的 toString() 实现?

最佳答案

我发现最好的方法是使用 java.lang.Class.getDeclaredMethod(String,Class<?>...) 并像这样在对象的类层次结构上调用它:

public static boolean objectHasToStringImplemented( final Object o ){
return classHasToStringImplemented( o.getClass() );
}


public static boolean classHasToStringImplemented( final Class<?> initialClass ){

Class<?> classToCheck = initialClass;
while( classToCheck != Object.class ){
if( classImplementsToString( classToCheck ) ){
return true;
}

classToCheck = classToCheck.getSuperclass();
}

return false;
}


private boolean classImplementsToString( final Class<?> aClass ){
try{
aClass.getDeclaredMethod( "toString" );
return true;

}catch( NoSuchMethodException e ){
return false;

}
}

然后我通过缓存答案而不触发异常来加快速度

//NB: implementation is synchronized and thus thread-safe
private static final Hashtable<Class<?>,Boolean> cachedAnswers = new Hashtable<>();
static {
cachedAnswers.put( Object.class, Boolean.FALSE );
}

public static Boolean objectHasToStringImplemented( final Object o ){
return classHasToStringImplemented( o.getClass() );
}


public static Boolean classHasToStringImplemented( final Class<?> classToCheck ){
if( cachedAnswers.containsKey( classToCheck ) ){
return cachedAnswers.get( classToCheck );
}

final Boolean result = classImplementsToString( classToCheck ) || classHasToStringImplemented( classToCheck.getSuperclass() );
cachedAnswers.put( classToCheck, result );

return result;
}

private static Boolean classImplementsToString( final Class<?> aClass ){
for( Method m : aClass.getDeclaredMethods() ){
if( isToString( m ) ){
return Boolean.TRUE;
}
}

return Boolean.FALSE;
}


private static Boolean isToString( final Method m ){
if( m.getParameterCount() == 0 && m.getName().equals( "toString" ) && m.getReturnType().equals( String.class ) ){
return Boolean.TRUE;

}else{
return Boolean.FALSE;
}
}

我测试过这个:


注意:我没有用 default 测试过这个方法实现,因为我目前无法访问 Java 8 JRE。

关于java - 如何判断一个对象是否实现了类似 toString() 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33157043/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com