Java反射之Java獲取方法信息實(shí)踐
本文主要獲取類的信息(包括類的成員函數(shù)、成員變量)
獲取類的信息
前面文章已經(jīng)說(shuō)過(guò)了,有三種方式,本文就不在贅述,采用其中的一種,通過(guò)實(shí)例對(duì)象.getClass()獲取類類型,從而獲取類的名稱
Class c = obj.getClass();//傳遞的是哪個(gè)子類的對(duì)象,c就是該子類的類類型 c.getName()
public static void main(String[] args) {
Class c1 = int.class;
Class c2 = String.class;
Class c3 = double.class;
Class c4 = Double.class;
//void關(guān)鍵字 存在類類型
Class c5 = void.class;
System.out.println(c1.getName());
System.out.println(c2.getName());
//不包含包名的類名稱
System.out.println(c2.getSimpleName());
System.out.println(c3.getName());
System.out.println(c4.getName());
}
其中obj是Object obj實(shí)例后的對(duì)象
成員函數(shù)(獲取類的方法對(duì)象)
Method類,方法對(duì)象,一個(gè)成員方法就是一個(gè)Method對(duì)象
- 獲取的是所有public的函數(shù),包括父類繼承而來(lái)的
getMethods() 方法獲取的是所有public的函數(shù),包括父類繼承而來(lái)的
- 獲取的是所有該類自己什么的方法
getDeclaredMethods() 獲取的是所有該類自己什么的方法,不論訪問(wèn)權(quán)限
- 方法的返回值類型的類類型
Class returnType = ms[i].getReturnType();
- 得到方法的返回值類型的名稱
returnType.getName()
- 方法的名稱
ms[i].getName()
- 獲取參數(shù)類型
Class[] parameterTypes = ms[i].getParameterTypes();
成員變量
成員變量也是對(duì)象,java.lang.reflect.Field, Field類封裝了關(guān)于成員變量的操作
getFields()方法獲取的是所有public的成員變量的信息
getDeclaredFields()獲取的是該類自己聲明的成員變量的信息
- 獲取成員變量數(shù)組
Field[] fs = c.getDeclaredFields();
- 獲取成員變量的類型名稱
Class fieldType = fd.getType(); String typeName = fieldType.getName();
- 獲取成員變量的名稱
String fieldName = fd.getName();
完整實(shí)例
ClassUtil
public class ClassUtil {
/**
* 打印類的信息,包括類的成員函數(shù)、成員變量
*/
public static void printClassMessage(Object obj){
//要獲取類的信息 首先要獲取類的類類型
Class c = obj.getClass();//傳遞的是哪個(gè)子類的對(duì)象,c就是該子類的類類型
//獲取類的名稱
System.out.println("獲取類的名稱:"+c.getName());
/**
* Method類,方法對(duì)象
* 一個(gè)成員方法就是一個(gè)Method對(duì)象
* getMethods() 方法獲取的是所有public的函數(shù),包括父類繼承而來(lái)的
* getDeclaredMethods() 獲取的是所有該類自己什么的方法,不論訪問(wèn)權(quán)限
*/
// Method[] ms = c.getMethods();
Method[] ms = c.getDeclaredMethods();
for (int i=0;i<ms.length;i++){
//得到方法的返回值類型的類類型
Class returnType = ms[i].getReturnType();
//得到方法的返回值類型的名稱
System.out.println(returnType.getName());
//得到方法的名稱
System.out.print(ms[i].getName()+"(");
//獲取參數(shù)類型--->得到的是參數(shù)列表的類型的類類型
//eg: string ---> 得到String.class
Class[] parameterTypes = ms[i].getParameterTypes();
for(Class c1:parameterTypes){
System.out.print(c1.getName()+",");
}
System.out.print(")");
}
/**
* 獲取成員變量
* @param obj
*/
public static void printFieldMessage(Object obj){
//要獲取類的信息 首先要獲取類的類類型
Class c = obj.getClass();//傳遞的是哪個(gè)子類的對(duì)象,c就是該子類的類類型
Field[] fs = c.getDeclaredFields();
for(Field fd:fs){
//得到成員變量的類型的類類型
Class fieldType = fd.getType();
String typeName = fieldType.getName();
//得到成員變量的名稱
String fieldName = fd.getName();
System.out.println(typeName+" "+fieldName);
}
}
}
所有public的函數(shù)的方法信息
public static void main(String[] args) {
String s= "hello";
ClassUtil.printClassMessage(s);
ClassUtil.printFieldMessage(s);
Integer a = 1;
ClassUtil.printClassMessage(a);
ClassUtil.printFieldMessage(a);
}
- 運(yùn)行結(jié)果展示:

獲取自己寫的類的方法信息
public class ClassUtil {
/**
* 打印類的信息,包括類的成員函數(shù)、成員變量
*/
public static void printClassMessage(Object obj){
//要獲取類的信息 首先要獲取類的類類型
Class c = obj.getClass();//傳遞的是哪個(gè)子類的對(duì)象,c就是該子類的類類型
//獲取類的名稱
System.out.println("獲取類的名稱:"+c.getName());
/**
* Method類,方法對(duì)象
* 一個(gè)成員方法就是一個(gè)Method對(duì)象
* getMethods() 方法獲取的是所有public的函數(shù),包括父類繼承而來(lái)的
* getDeclaredMethods() 獲取的是所有該類自己什么的方法,不論訪問(wèn)權(quán)限
*/
// Method[] ms = c.getMethods();
Method[] ms = c.getDeclaredMethods();
for (int i=0;i<ms.length;i++){
//得到方法的返回值類型的類類型
Class returnType = ms[i].getReturnType();
//得到方法的返回值類型的名稱
System.out.println(returnType.getName());
//得到方法的名稱
System.out.print(ms[i].getName()+"(");
//獲取參數(shù)類型--->得到的是參數(shù)列表的類型的類類型
//eg: string ---> 得到String.class
Class[] parameterTypes = ms[i].getParameterTypes();
for(Class c1:parameterTypes){
System.out.print(c1.getName()+",");
}
System.out.print(")");
}
}
public static void main(String[] args) {
ThemeInfo themeInfo = new ThemeInfo();
themeInfo.setId("1");
ClassUtil.printClassMessage(themeInfo);
ClassUtil.printFieldMessage(themeInfo);
}
}
運(yùn)行結(jié)果展示:
- 成員方法:

- 成員變量:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringData @Query和@Modifying注解原理解析
這篇文章主要介紹了SpringData @Query和@Modifying注解原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
java IO數(shù)據(jù)操作流、對(duì)象序列化、壓縮流代碼解析
這篇文章主要介紹了java IO數(shù)據(jù)操作流、對(duì)象序列化、壓縮流代碼解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
java 異常被catch后 將會(huì)繼續(xù)執(zhí)行的操作
這篇文章主要介紹了java 異常被catch后 將會(huì)繼續(xù)執(zhí)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
java多線程編程之為什么要進(jìn)行數(shù)據(jù)同步
數(shù)據(jù)同步就是指在同一時(shí)間,只能由一個(gè)線程來(lái)訪問(wèn)被同步的類變量,當(dāng)前線程訪問(wèn)完這些變量后,其他線程才能繼續(xù)訪問(wèn),下面看一下為什么要進(jìn)行數(shù)據(jù)同步2014-01-01
一文了解Java讀寫鎖ReentrantReadWriteLock的使用
ReentrantReadWriteLock稱為讀寫鎖,它提供一個(gè)讀鎖,支持多個(gè)線程共享同一把鎖。這篇文章主要講解一下ReentrantReadWriteLock的使用和應(yīng)用場(chǎng)景,感興趣的可以了解一下2022-10-10
Java利用Poi讀取excel并對(duì)所有類型進(jìn)行處理
這篇文章主要為大家詳細(xì)介紹了Java利用Poi讀取excel并對(duì)所有類型進(jìn)行處理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2024-01-01

