说明
Java提供了instanceof运算符来比较两个类或接口之间是否存在继承关系。
技巧
TreeSet是基于TreeMap的NavigableSet实现的。它使用元素的自然排序对元素进行排序,或者根据创建set时提供的Comparator进行排序。
代码实例
1、创建ClassComparator类继承Comparator接口,实现compare()方法,并根据isAssignableFrom()方法的返回值来判断两个类之间的关系。
package reflect;
import java.util.Comparator;
public class ClassComparator implements Comparator<Class<?>> {
@Override
public int compare(Class<?> clazz1,Class<?>clazz2){
if (clazz1.equals(clazz2)) { //如果两个类对象相同,则返回0
return 0;
}
if (clazz1.isAssignableFrom(clazz2)) {//如果clazz1是clazz2的父类则返回-1
return -1;
}
if (clazz2.isAssignableFrom(clazz1)) {//如果clazz1是clazz2的子类则返回1
return 1;
}
throw new IllegalArgumentException("两个类之间没有关系"); //其他情况抛出异常
}
}
2、编写Test类进行测试:
package reflect;
import javax.swing.*;
import java.awt.*;
import java.util.TreeSet;
public class ClassComparatorTest {
public static void main(String[] args) {
TreeSet<Class<?>> treeSet = new TreeSet<Class<?>>(new ClassComparator());
System.out.println("向树集中添加JPanel.class");
treeSet.add(JPanel.class);
System.out.println("向树集中添加JComponent.class");
treeSet.add(JComponent.class);
System.out.println("向树集中添加Container.class");
treeSet.add(Container.class);
System.out.println("获取树集的最后一个元素:");
System.out.println(treeSet.last());
}
}
运行结果如下:
向树集中添加JPanel.class
向树集中添加JComponent.class
向树集中添加Container.class
获取树集的最后一个元素:
class javax.swing.JPanel
Process finished with exit code 0