Java 有提供 instanceof 來檢查兩個類別或介面是否存在繼承關係,然而如果有多個類別需要按照繼曾關係進行排序時,使用instanceof 則會非常麻煩。

此實驗利用反射機制對 存在繼承關係的類別 進行排序。

 

isAssignableFrom 可以判斷類別之間的關係,如果相同或是父類別(Super Class),則回傳true,否則回傳false。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public class ClassComparator implements Comparator<Class<?>>{

	@Override
	public int compare(Class<?> o1, Class<?> o2) {
		// TODO Auto-generated method stub
		if(o1.equals(o2))
			return 0;
		else if(o1.isAssignableFrom(o2))
			return -1;
		else if (o2.isAssignableFrom(o1)) {
			return 1;
		}else
			throw new IllegalArgumentException("兩個類別之間沒有關係");
	}
	
}

 

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public class Test {
	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("獲得樹集合的最後一個元素");
		System.out.println(treeSet.last());
		
		System.out.println();
		for(Class<?> clazz : treeSet)
			System.out.println(clazz.getName());
	}
}

 

 

 

完整專案 (連結)

 

 

文章標籤
全站熱搜
創作者介紹
創作者 Lung-Yu,Tsai 的頭像
Lung-Yu,Tsai

Lung-Yu,Tsai 的部落格

Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣(46)