Class.isAssignableFrom();执行运行时的检查,以校验传递的对象确实属于我们感兴趣的继承结构。
统计基类和确切类型个数。
import java.util.HashMap;
import java.util.Map;
/**
* @author E-mail:
* @version 2018年6月2日 上午11:45:49
*/
public class TypeCounter extends HashMap<Class<?>, Integer> {
private Class<?> baseType;
public TypeCounter(Class<?> baseType){
this.baseType = baseType;
}
public void count(Object obj){
Class<?> type = obj.getClass();
if(!baseType.isAssignableFrom(type))
throw new RuntimeException(obj + " incorrect type:"
+type+",should be type or subtype of "+baseType );
countClass(type);
}
private void countClass(Class<?> type){
Integer quantity = get(type);
put(type,quantity==null?1:quantity+1);
Class<?> superClass = type.getSuperclass();
if(superClass!=null&&baseType.isAssignableFrom(superClass))
countClass(superClass);
}
public String toString(){
StringBuilder result = new StringBuilder("{");
for(Map.Entry<Class<?>, Integer> pair : entrySet()){
result.append(pair.getKey().getSimpleName());
result.append("=");
result.append(pair.getValue());
result.append(", ");
}
result.delete(result.length()-2, result.length());
result.append("}");
return result.toString();
}
}