天天看點

Java反射機制(二):通過反射取得類的結構

在反射運用過程中,如果你想得到一個類的完整結構,那麼就要使用到java.lang.reflect包中的幾個類:

· constructor  表示類中的構造方法

· field  表示類中的屬性

· method 表示類中的方法

接下來,我們講講,如何通過這些api,去擷取一個類的完整性結構。

首先,我們定義一個類:

一、 通過反射取得類所實作的全部接口

Java反射機制(二):通過反射取得類的結構

輸出: 實作的接口名稱:com.chen.yuan.vo.china

二、 取得類所繼承的父類

Java反射機制(二):通過反射取得類的結構

輸出: 父類名稱:java.lang.object

三、取得類中的全部構造方法

輸出:

構造方法:public com.chen.yuan.vo.person(java.lang.string,int)

構造方法:public com.chen.yuan.vo.person(java.lang.string)

構造方法:public com.chen.yuan.vo.person()

以上直接列印出構造方法,調用的是constructor類中 的tostring()方法。

constructor類中存在了一下幾個幾個方法:

· public int getmodifiers()取得修飾符

· public string getname()取得方法名稱

· public class<?>[] getparametertypes()取得參數的類型

構造方法:1 com.chen.yuan.vo.person(java.lang.string arg0,int arg0){}

構造方法:1 com.chen.yuan.vo.person(java.lang.string arg1){}

構造方法:1 com.chen.yuan.vo.person(){}

觀察輸出,我們發現,所有的修飾符變成了數字,我們肯定不懂這些個數字是什麼意思,那麼接下來,讓我們還原修飾符。此時,我們需要借助modifier類完成,此類定義在java.lang.reflect包中,我們可以直接使用modifier類中的tostring(int mod)方法完成還原修飾符的操作。

先看一下modifier類中的tostring(int mod)方法的源碼:

通過源碼,我們應當很容易的發現,在modifier類中的tostring(int mod)方法中,我們進行了轉換的操作。

構造方法:public com.chen.yuan.vo.person(java.lang.string arg0,int arg0){}

構造方法:public com.chen.yuan.vo.person(java.lang.string arg1){}

構造方法:public com.chen.yuan.vo.person(){}

四、 取得全部方法

要想取得一個類中的全部方法,可以通過class類中的getdeclaredmethods()方法,此方法傳回一個method類的對象數組,然後我們可以通過method類,去進一步得到方法的詳細資訊。

輸出;

public class java.lang.string getname()

public void setname(java.lang.string arg0)

public void saychina()

public class java.lang.string sayhello(java.lang.string arg0,int arg1)

public void setage(int arg0)

public int getage()

public final void wait(long arg0,int arg1) throws java.lang.interruptedexception,

public final native void wait(long arg0) throws java.lang.interruptedexception

public final void wait() throws java.lang.interruptedexception

public boolean equals(java.lang.object arg0)

public class java.lang.string tostring()

public native int hashcode()

public final native class java.lang.class getclass()

public final native void notify()

public final native void notifyall()

五、 取得類中的屬性

class類中提供了兩種不同的操作,可以獲得field:

1) 得到實作的接口或父類中的公共屬性: public field[] getfields() throws securityexception

2) 得到本類中的全部屬性: public field[] getdeclaredfields() throws securityexception

輸出:

本類屬性:private java.lang.string name ;

本類屬性:private int age ;

公共屬性:public static final java.lang.string national ;

公共屬性:public static final java.lang.string author ;