2015-10-15 86 views

回答

1

我發現,最好是使用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; 
    } 
} 

我已經測試了這個:


NB:我還沒有用default方法實現進行測試,因爲我目前沒有訪問Java 8 JRE的權限。

相關問題