Java反射(5)獲取繼承關系


目錄:
通過Class對象可以獲取繼承關系:

  • 1.Class getSuperclass():獲取父類類型;(單繼承)
  • 2.Class[] getInterfaces():獲取當前類實現的所有接口;(多實現)
  • 3.通過Class對象的isAssignableFrom()方法,判斷Class向上轉型是否可以實現。

1.獲取父類類型

public class Main {
    public static void main(String[] args) throws Exception {
        Class i = Integer.class;
        Class n = i.getSuperclass();
        System.out.println(n);
        Class o = n.getSuperclass();
        System.out.println(o);
        System.out.println(o.getSuperclass());
    }
}

輸出:

class java.lang.Number 
class java.lang.Object 
null 

Integer的父類類型是Number,Number的父類是Object,Object的父類是null。除Object外,其他任何非interface的Class都必定存在一個父類類型。

2.獲取當前類實現的所有接口

public class Main {
    public static void main(String[] args) throws Exception {
        Class s = Integer.class;
        Class[] is = s.getInterfaces();
        for (Class i : is) {
            System.out.println(i);
        }
    }
}

輸出Integer實現的接口有:

java.lang.Comparable
java.lang.constant.Constable
java.lang.constant.ConstantDesc

3.判斷Class向上轉型

在非反射調用中,當我們判斷一個實例是否是某個類型時,正常情況下,使用instanceof操作符:

Object n = Integer.valueOf(123);
boolean isDouble = n instanceof Double; // false
boolean isInteger = n instanceof Integer; // true
boolean isNumber = n instanceof Number; // true
boolean isSerializable = n instanceof java.io.Serializable; // true

如果是兩個Class實例,要判斷一個向上轉型是否成立,可以調用isAssignableFrom():

// Integer i = ?
Integer.class.isAssignableFrom(Integer.class); // true,因為Integer可以賦值給Integer
// Number n = ?
Number.class.isAssignableFrom(Integer.class); // true,因為Integer可以賦值給Number
// Object o = ?
Object.class.isAssignableFrom(Integer.class); // true,因為Integer可以賦值給Object
// Integer i = ?
Integer.class.isAssignableFrom(Number.class); // false,因為Number不能賦值給Integer

博客來源:
https://www.liaoxuefeng.com/wiki/1252599548343744/1264804244564000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM