Vector est une ancienne classe un peu dépréciée.Je vais utiliser une version de liste générique à la place:
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;
}
Et en bonus, voici une méthode qui rassemble toutes les interfaces assignables selon la méthode ci-dessus:
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;
}
Test:
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));
}
sortie:
[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]
Un peu hors sujet (d'où un commentaire), mais utilisez ArrayList pas Vector. Vector synchronise ses méthodes et est donc beaucoup plus lent. Il n'y a pratiquement aucune raison d'utiliser Vector même dans un code multithread, sauf pour la rétrocompatibilité. – locka
J'irais plus loin: ** Il n'y a pratiquement aucune raison de jamais utiliser Vector **. Déjà. Nor Hashtable, Enumeration et quelques autres classes héritées. –