1. 程式人生 > >Java反射之——Java獲取類的成員函式的資訊

Java反射之——Java獲取類的成員函式的資訊

本文主要講述如何獲取類的資訊,包括類的成員變數和成員函式,首先我們先了解一下,基本的資料型別和void關鍵字有沒有各自的類型別,答案是有的!

一、如何獲取基本的資料型別和void關鍵字的類型別:

程式碼奉上:

public static void main(String[] args) {
        // 基本的資料型別和void關鍵字都存在類型別
        Class c1 = int.class;//int類的類型別
        Class c2 = String.class;//string類的類型別,(string類的位元組碼)
        Class c3 = double.class;
        Class c4 = Double.class;
        Class c5 = void.class;
        System.out.println("c1的名稱:"+c1.getName());
        System.out.println("c2的名稱:"+c2.getName());//類的全稱
        System.out.println("c2的名稱:"+c2.getSimpleName());//不包含包名的類的全稱
        System.out.println("c3的名稱:"+c3.getName());
        System.out.println("c4的名稱:"+c4.getName());
        System.out.println("c5的名稱:"+c5.getName());
        
    }

輸出結果:

c1的名稱:int
c2的名稱:java.lang.String
c2的名稱:String
c3的名稱:double
c4的名稱:java.lang.Double
c5的名稱:void

在這裡getName()和getSimpleName()是兩個不同的方法,前者表示獲取類的名稱包括包名,而後者獲取的是不含包名的類的名稱

二、獲取類中方法的資訊(包括返回值型別、方法名、引數列表類的類型別):

先普及一下在獲取類中方法的資訊時,Class提供的幾個方法

getName()——獲取類的名稱(得到方法的名稱也是使用該方法)

getMethods()——獲取類中所有的public修飾的方法,包括其繼承類的公用方法和它所實現介面的方法。獲取的是一個數組。

getDeclaredMethods()——物件表示的類或介面自身宣告的所有方法,包括公共、保護、預設(包)訪問和私有方法,但不包括繼承的方法。當然也包括它所實現介面的方法。

注:方法也是物件,方法是Method的物件。一個成員方法就是一個Method 物件。

getReturnType()——獲取方法的返回值型別,得到的是返回值型別的類型別(如果返回值是string,得到的就是string.class;如果返回值型別是int,得到的就是int.class。然後再呼叫getName()得到返回值型別的名稱)。

getParameterTypes()——獲取的是引數型別,得到的是引數列表的型別的類型別(引數列表如果是int,int 得到的就是int.class,int.class 並放到陣列中)

程式碼奉上:

/**
 * 列印類的資訊
 * 包括類的成員函式和成員變數
 *
 */
public class MethodUtil {
    public static void printMethod(Object object) {
        //首先獲取類的類型別,通過getClass()方法(因為引數是一個物件,獲取該物件所屬類的資訊)
        //注:object類是一切類的父類,因此傳遞的是哪一個子類的物件,獲取到的就是該子類的類型別
        Class c = object.getClass();
        //獲取類的全稱
        System.out.println("類的全稱是:"+c.getName());
        //獲取類中的所有的方法,使用陣列接收
        Method[] me = c.getMethods();
        for (int i = 0; i < me.length; i++) {
            //獲取方法的返回值型別的類型別(返回值是string,得到的就是string.class)
            Class returnType = me[i].getReturnType();
            System.out.print("該方法的返回值型別是:"+returnType.getName()+" ");
            //獲取物件的全稱
            System.out.print("該方法的名稱是:"+me[i].getName()+"(");
            //獲取引數列表的型別的類型別(引數列表是string, string 得到的就是string.class, string.class)
            Class[] param = me[i].getParameterTypes();
            for (Class class1 : param) {
                System.out.print("引數列表的型別的類型別是:"+class1.getName()+",");
            }
            System.out.println(")");
        }
    }
}

在main方法中呼叫:MethodUtil.printMethod("hello");
輸出結果:

類的全稱是:java.lang.String
該方法的返回值型別是:boolean 該方法的名稱是:equals(引數列表的型別的類型別是:java.lang.Object,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:toString()
該方法的返回值型別是:int 該方法的名稱是:hashCode()
該方法的返回值型別是:int 該方法的名稱是:compareTo(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:int 該方法的名稱是:compareTo(引數列表的型別的類型別是:java.lang.Object,)
該方法的返回值型別是:int 該方法的名稱是:indexOf(引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:indexOf(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:int 該方法的名稱是:indexOf(引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:indexOf(引數列表的型別的類型別是:int,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:int,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:long,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:float,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:boolean,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:[C,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:[C,引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:java.lang.Object,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:char,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:valueOf(引數列表的型別的類型別是:double,)
該方法的返回值型別是:char 該方法的名稱是:charAt(引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:codePointAt(引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:codePointBefore(引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:codePointCount(引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:compareToIgnoreCase(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:concat(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:boolean 該方法的名稱是:contains(引數列表的型別的類型別是:java.lang.CharSequence,)
該方法的返回值型別是:boolean 該方法的名稱是:contentEquals(引數列表的型別的類型別是:java.lang.CharSequence,)
該方法的返回值型別是:boolean 該方法的名稱是:contentEquals(引數列表的型別的類型別是:java.lang.StringBuffer,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:copyValueOf(引數列表的型別的類型別是:[C,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:copyValueOf(引數列表的型別的類型別是:[C,引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:boolean 該方法的名稱是:endsWith(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:boolean 該方法的名稱是:equalsIgnoreCase(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:format(引數列表的型別的類型別是:java.util.Locale,引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:[Ljava.lang.Object;,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:format(引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:[Ljava.lang.Object;,)
該方法的返回值型別是:void 該方法的名稱是:getBytes(引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,引數列表的型別的類型別是:[B,引數列表的型別的類型別是:int,)
該方法的返回值型別是:[B 該方法的名稱是:getBytes(引數列表的型別的類型別是:java.nio.charset.Charset,)
該方法的返回值型別是:[B 該方法的名稱是:getBytes(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:[B 該方法的名稱是:getBytes()
該方法的返回值型別是:void 該方法的名稱是:getChars(引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,引數列表的型別的類型別是:[C,引數列表的型別的類型別是:int,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:intern()
該方法的返回值型別是:boolean 該方法的名稱是:isEmpty()
該方法的返回值型別是:java.lang.String 該方法的名稱是:join(引數列表的型別的類型別是:java.lang.CharSequence,引數列表的型別的類型別是:[Ljava.lang.CharSequence;,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:join(引數列表的型別的類型別是:java.lang.CharSequence,引數列表的型別的類型別是:java.lang.Iterable,)
該方法的返回值型別是:int 該方法的名稱是:lastIndexOf(引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:lastIndexOf(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:int 該方法的名稱是:lastIndexOf(引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:lastIndexOf(引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:int 該方法的名稱是:length()
該方法的返回值型別是:boolean 該方法的名稱是:matches(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:int 該方法的名稱是:offsetByCodePoints(引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:boolean 該方法的名稱是:regionMatches(引數列表的型別的類型別是:int,引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:boolean 該方法的名稱是:regionMatches(引數列表的型別的類型別是:boolean,引數列表的型別的類型別是:int,引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:replace(引數列表的型別的類型別是:char,引數列表的型別的類型別是:char,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:replace(引數列表的型別的類型別是:java.lang.CharSequence,引數列表的型別的類型別是:java.lang.CharSequence,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:replaceAll(引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:replaceFirst(引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:[Ljava.lang.String; 該方法的名稱是:split(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:[Ljava.lang.String; 該方法的名稱是:split(引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:int,)
該方法的返回值型別是:boolean 該方法的名稱是:startsWith(引數列表的型別的類型別是:java.lang.String,引數列表的型別的類型別是:int,)
該方法的返回值型別是:boolean 該方法的名稱是:startsWith(引數列表的型別的類型別是:java.lang.String,)
該方法的返回值型別是:java.lang.CharSequence 該方法的名稱是:subSequence(引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:substring(引數列表的型別的類型別是:int,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:substring(引數列表的型別的類型別是:int,引數列表的型別的類型別是:int,)
該方法的返回值型別是:[C 該方法的名稱是:toCharArray()
該方法的返回值型別是:java.lang.String 該方法的名稱是:toLowerCase(引數列表的型別的類型別是:java.util.Locale,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:toLowerCase()
該方法的返回值型別是:java.lang.String 該方法的名稱是:toUpperCase()
該方法的返回值型別是:java.lang.String 該方法的名稱是:toUpperCase(引數列表的型別的類型別是:java.util.Locale,)
該方法的返回值型別是:java.lang.String 該方法的名稱是:trim()
該方法的返回值型別是:void 該方法的名稱是:wait()
該方法的返回值型別是:void 該方法的名稱是:wait(引數列表的型別的類型別是:long,引數列表的型別的類型別是:int,)
該方法的返回值型別是:void 該方法的名稱是:wait(引數列表的型別的類型別是:long,)
該方法的返回值型別是:java.lang.Class 該方法的名稱是:getClass()
該方法的返回值型別是:void 該方法的名稱是:notify()
該方法的返回值型別是:void 該方法的名稱是:notifyAll()
該方法的返回值型別是:java.util.stream.IntStream 該方法的名稱是:chars()
該方法的返回值型別是:java.util.stream.IntStream 該方法的名稱是:codePoints()
 

我們也可以獲取其他類的方法,比如Integer類,在此就不編寫啦。