Я не мог не найти этот забавный проект. Вот код прототипа, который дает вам необходимую информацию. Этот код просто пытается вычислить все возможные пути наследования от одного класса к другому. Вы можете использовать это, чтобы получить все пути от вашего исходного объекта ко всем возможным классам, которые вас интересуют. Как упоминалось в других комментариях, вам, возможно, придется позвонить по поводу того, предпочитаете ли вы пути, использующие интерфейсы, или нет, но надеюсь, этот код будет полезен для вас.
public class InheritenceDepth {
/**
* Obtains a list of all the possible inheritance paths from the given targetClass
* to the specified potentialAncestorClass. If the targetClass does not extend or implement
* the potentialAncestorClass the return list will be empty.
*/
public static List<InheritancePath> classInheritancePaths(Class<?> targetClass, Class<?> potentialAncestorClass){
List<InheritancePath> returnList = new ArrayList<InheritancePath>();
if(potentialAncestorClass.isAssignableFrom(targetClass)){
if(potentialAncestorClass.equals(targetClass)){
returnList.add(new InheritancePath(potentialAncestorClass));
}
if(targetClass.getSuperclass() != null){
// try superclass
List<InheritancePath> pathsFromSuperClass =
classInheritancePaths(targetClass.getSuperclass(), potentialAncestorClass);
if(!pathsFromSuperClass.isEmpty()){
for(InheritancePath path : pathsFromSuperClass){
path.add(targetClass);
returnList.add(path);
}
}
}
// try interfaces
for(Class<?> interf : targetClass.getInterfaces()){
List<InheritancePath> pathsFromInterface =
classInheritancePaths(interf, potentialAncestorClass);
if(!pathsFromInterface.isEmpty()){
for(InheritancePath path : pathsFromInterface){
path.add(targetClass);
returnList.add(path);
}
}
}
}
return returnList;
}
/**
* Represents the path from a base class to a superclass
*/
public static final class InheritancePath implements Iterable<Class<?>>{
private List<Class<?>> path = new ArrayList<Class<?>>();
public InheritancePath(Class<?> root){
path.add(root);
}
void add(Class<?> pathElement){
path.add(0, pathElement);
}
public Iterator<Class<?>> iterator(){
return path.iterator();
}
public int depth(){
return path.size();
}
public String toString(){
StringBuilder sb = new StringBuilder();
for(int i = 0; i < path.size(); i++){
sb.append(path.get(i).getName());
if(i < path.size() - 1){
sb.append(" -> ");
}
}
return sb.toString();
}
}
public static void main(String[] args) {
List<InheritancePath> paths = classInheritancePaths(ConcurrentLinkedQueue.class, Collection.class);
for(InheritancePath path : paths){
System.out.println(path);
}
}
}