java反射之獲取類的信息方法(推薦)
本文接上文“老生常談反射之Class類的使用(必看篇)”,以編寫一個用來獲取類的信息(成員函數(shù)、成員變量、構(gòu)造函數(shù))的工具類來講解"反射之獲取類的信息"
1、獲取成員函數(shù)信息
/**
* 獲取成員函數(shù)信息
* @param obj
*/
public static void printClassMethodMessage(Object obj){
//獲取類的信息 獲取類的類類型
Class c = obj.getClass();
//獲取類的名稱
System.out.println("類的名稱是:" + c.getName());
/**
* Methods類,方法對象
* 一個成員方法就是一個Method對象
* getMethods()方法是獲取所有public的函數(shù),包括父類繼承而來
* getDeclaredMethods()獲取的是所有該類自己聲明的方法,不問訪問權(quán)限
*/
// Method [] ms = c.getMethods();
Method [] ms = c.getDeclaredMethods();
for (Method m : ms) {
//得到方法返回值的類類型
Class returnType = m.getReturnType();
System.out.print(returnType.getName() + " ");
//得到方法名稱
System.out.print(m.getName() + "(");
//獲取參數(shù)類型(得到的是參數(shù)列表的類型的類類型)
Class[] paramTypes = m.getParameterTypes();
for (Class paramType : paramTypes) {
System.out.print(paramType.getName()+",");
}
System.out.println(")");
}
}
2、獲取成員變量信息
/**
* 獲取成員變量信息
* @param obj
*/
public static void printClassFieldMessage(Object obj) {
Class c = obj.getClass();
/**
* 成員變量也是對象
* Field類封裝了關(guān)于成員變量的操作
* getFields()獲取的是所有的public的成員變量信息
* getDeclaredFields()獲取的是該類自己聲明的成員變量信息
*/
// Field [] fs = c.getFields();
Field[] fs = c.getDeclaredFields();
for (Field f : fs) {
//得到成員變量的類型的類類型
Class fieldType = f.getType();
String typeName = fieldType.getName();
//得到成員變量的名稱
String fieldName = f.getName();
System.out.println(typeName+" "+fieldName);
}
}
3、獲取構(gòu)造函數(shù)信息
public static void printConMessage(Object obj){
Class c = obj.getClass();
/**
* 構(gòu)造函數(shù)也是對象
* java.lang.Constructor封裝了構(gòu)造函數(shù)的信息
* getConstructors()獲取所有的public構(gòu)造函數(shù)
* getDeclaredConstructors()獲取所有的構(gòu)造函數(shù)
*/
// Constructor[] cs = c.getConstructors();
Constructor[] cs = c.getDeclaredConstructors();
for (Constructor constructor : cs) {
System.out.print(constructor.getName()+"(");
//獲取構(gòu)造函數(shù)的參數(shù)列表,得到的是參數(shù)列表的類類型
Class[] paramTypes = constructor.getParameterTypes();
for (Class paramType : paramTypes) {
System.out.print(paramType.getName()+",");
}
System.out.println(")");
}
}
4、工具類代碼
package com.format.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 打印類的信息,成員函數(shù)、成員變量
* Created by Format on 2017/6/3.
*/
public class ClassUtil {
/**
* 獲取成員函數(shù)信息
* @param obj
*/
public static void printClassMethodMessage(Object obj){
//獲取類的信息 獲取類的類類型
Class c = obj.getClass();
//獲取類的名稱
System.out.println("類的名稱是:" + c.getName());
/**
* Methods類,方法對象
* 一個成員方法就是一個Method對象
* getMethods()方法是獲取所有public的函數(shù),包括父類繼承而來
* getDeclaredMethods()獲取的是所有該類自己聲明的方法,不問訪問權(quán)限
*/
// Method [] ms = c.getMethods();
Method [] ms = c.getDeclaredMethods();
for (Method m : ms) {
//得到方法返回值的類類型
Class returnType = m.getReturnType();
System.out.print(returnType.getName() + " ");
//得到方法名稱
System.out.print(m.getName() + "(");
//獲取參數(shù)類型(得到的是參數(shù)列表的類型的類類型)
Class[] paramTypes = m.getParameterTypes();
for (Class paramType : paramTypes) {
System.out.print(paramType.getName()+",");
}
System.out.println(")");
}
}
/**
* 獲取成員變量信息
* @param obj
*/
public static void printClassFieldMessage(Object obj) {
Class c = obj.getClass();
/**
* 成員變量也是對象
* Field類封裝了關(guān)于成員變量的操作
* getFields()獲取的是所有的public的成員變量信息
* getDeclaredFields()獲取的是該類自己聲明的成員變量信息
*/
// Field [] fs = c.getFields();
Field[] fs = c.getDeclaredFields();
for (Field f : fs) {
//得到成員變量的類型的類類型
Class fieldType = f.getType();
String typeName = fieldType.getName();
//得到成員變量的名稱
String fieldName = f.getName();
System.out.println(typeName+" "+fieldName);
}
}
/**
* 獲取構(gòu)造函數(shù)信息
* @param obj
*/
public static void printConMessage(Object obj){
Class c = obj.getClass();
/**
* 構(gòu)造函數(shù)也是對象
* java.lang.Constructor封裝了構(gòu)造函數(shù)的信息
* getConstructors()獲取所有的public構(gòu)造函數(shù)
* getDeclaredConstructors()獲取所有的構(gòu)造函數(shù)
*/
// Constructor[] cs = c.getConstructors();
Constructor[] cs = c.getDeclaredConstructors();
for (Constructor constructor : cs) {
System.out.print(constructor.getName()+"(");
//獲取構(gòu)造函數(shù)的參數(shù)列表,得到的是參數(shù)列表的類類型
Class[] paramTypes = constructor.getParameterTypes();
for (Class paramType : paramTypes) {
System.out.print(paramType.getName()+",");
}
System.out.println(")");
}
}
}
以上這篇java反射之獲取類的信息方法(推薦)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot中Mybatis + Druid 數(shù)據(jù)訪問的詳細(xì)過程
Spring Boot 底層都是采用 SpringData 的方式進(jìn)行統(tǒng)一處理各種數(shù)據(jù)庫,SpringData也是Spring中與SpringBoot、SpringCloud 等齊名的知名項(xiàng)目,下面看下SpringBoot Mybatis Druid數(shù)據(jù)訪問的詳細(xì)過程,感興趣的朋友一起看看吧2021-11-11
Spring中的@ConfigurationProperties詳解
這篇文章主要介紹了Spring中的@ConfigurationProperties詳解,ConfigurationProperties注解主要用于將外部配置文件配置的屬性填充到這個Spring Bean實(shí)例中,需要的朋友可以參考下2023-09-09
Spring boot實(shí)現(xiàn)應(yīng)用打包部署的示例
本篇文章主要介紹了Spring boot實(shí)現(xiàn)應(yīng)用打包部署的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Java數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)哈希表的分離鏈接法
今天給大家?guī)淼氖顷P(guān)于Java數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識,文章圍繞著Java哈希表的分離鏈接法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
SpringBoot將多個文件夾進(jìn)行壓縮的兩種方法(瀏覽器下載和另存為)
Spring Boot項(xiàng)目通常不會自動對文件夾進(jìn)行壓縮,不過,在打包應(yīng)用時,如果你使用了Maven或Gradle這樣的構(gòu)建工具,并且配置了相應(yīng)的插件,可以在打成jar或war包的時候?qū)⒁蕾嚨膸煳募喜⒉嚎s,本文介紹了SpringBoot將多個文件夾進(jìn)行壓縮的兩種方法2024-07-07

