Vector是一個古老的,有些過時的類。我將使用一個通用的清單版本而不是:
public static List<Class<?>> getAssignableClasses(final Object o){
final List<Class<?>> list;
if(o == null){
list = Collections.emptyList();
} else{
list = new ArrayList<Class<?>>();
Class<?> tmp = o.getClass();
do{
list.add(tmp);
tmp = tmp.getSuperclass();
} while(tmp != null);
}
return list;
}
作爲獎勵,這裏是一家集基於上述方法都分配接口的方法:
public static List<Class<?>> getAssignableInterfaces(final Object o){
final List<Class<?>> result;
final List<Class<?>> assignableClasses = getAssignableClasses(o);
if(assignableClasses.isEmpty()){
result = Collections.emptyList();
} else{
final Set<Class<?>> interfaces =
new LinkedHashSet<Class<?>>(assignableClasses.size() * 2);
for(final Class<?> clazz : assignableClasses){
interfaces.addAll(Arrays.asList(clazz.getInterfaces()));
}
result = new ArrayList<Class<?>>(interfaces);
}
return result;
}
測試:
public static void main(final String[] args){
final Map<String, String> map =
new ConcurrentHashMap<String, String>();
System.out.println(getAssignableClasses(map));
System.out.println(getAssignableInterfaces(map));
}
輸出:
[class java.util.concurrent.ConcurrentHashMap, class java.util.AbstractMap, class java.lang.Object]
[interface java.util.concurrent.ConcurrentMap, interface java.io.Serializable, interface java.util.Map]
有點偏離主題(因此是評論),但使用ArrayList而不是Vector。 Vector同步它的方法,因此慢很多。除了向後兼容性外,甚至在多線程代碼中幾乎沒有理由使用Vector。 – locka 2010-10-06 09:01:41
我會走得更遠:**實際上沒有理由使用Vector **。永遠。也沒有Hashtable,枚舉和其他一些遺留類。 – 2010-10-06 09:14:46