最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java通過反射來打印類的方法實(shí)現(xiàn)

 更新時間:2021年09月17日 08:38:36   作者:Zong_0915  
本文主要介紹了Java通過反射來打印類的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

工作了有一段時間了,我覺得是時候去復(fù)習(xí)下Java的一些基礎(chǔ)知識,因此寫下了這篇文章。平常開發(fā)過程中,前端寫的比較多,后端也不能忘!

在這里插入圖片描述

一. 案例出發(fā)

先準(zhǔn)備一個模板類:

public class User {
    public int id;
    private String name;

    public User(String name, int id) {
        this.id = id;
        this.name = name;
    }

    private User(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

開始反射

import java.lang.reflect.*;

public class Test {
    public static final String LINE = "\n";
    public static final String SPACE = "    ";

    public static void main(String[] args) throws Exception {
        Class<?> c = Class.forName("com.User");
        // Class<?> c = Test.class.getClassLoader().loadClass("com.User");
        StringBuilder sb = new StringBuilder();
        // 打印包,類名
        String packageName = c.getPackage().getName();
        sb.append("package " + packageName + ";" + LINE);
        sb.append(LINE);
        sb.append("public class " + c.getSimpleName() + "{" + LINE);
        // 打印成員變量
        Field[] declaredFields = c.getDeclaredFields();
        for (Field field : declaredFields) {
            // Field.getModifiers()返回一個int類型的數(shù)值,用于標(biāo)識public、static等標(biāo)識符
            String fieldModifier = Modifier.toString(field.getModifiers());
            // 獲取屬性類型的簡要名稱
            String typeName = field.getType().getSimpleName();
            // 屬性的名稱
            String fieldName = field.getName();
            sb.append(SPACE + fieldModifier + " " + typeName + " " + fieldName + ";" + LINE);
        }
        sb.append(LINE);
        // 打印構(gòu)造
        Constructor<?>[] declaredConstructors = c.getDeclaredConstructors();
        for (Constructor<?> constructor : declaredConstructors) {
            // 構(gòu)造函數(shù)的標(biāo)識符
            String constructorModifier = Modifier.toString(constructor.getModifiers());
            sb.append(SPACE + constructorModifier + " " + c.getSimpleName() + " " + "(");
            // 打印構(gòu)造函數(shù)的參數(shù)
            printParam(sb, constructor.getParameterTypes());
        }
        // 打印方法
        Method[] methods = c.getDeclaredMethods();
        for (Method method : methods) {
            // 方法的標(biāo)識符
            String methodModifier = Modifier.toString(method.getModifiers());
            // 方法返回類型
            String returnTypeName = method.getReturnType().getSimpleName();
            // 方法名稱
            String methodName = method.getName();
            sb.append(SPACE + methodModifier + " " + returnTypeName + " " + methodName + "(");
            printParam(sb, method.getParameterTypes());
        }

        sb.append("}");
        System.out.println(sb.toString());
    }

    private static void printParam(StringBuilder sb, Class<?>[] parameterTypes2) {
        Class<?>[] parameterTypes = parameterTypes2;
        for (int i = 0; i < parameterTypes.length; i++) {
            // 參數(shù)的類型
            String simpleName = parameterTypes[i].getSimpleName();
            if (i == 0) {
                sb.append(simpleName + " args");
            } else {
                sb.append(", " + simpleName + " args");
            }
        }
        sb.append(") {" + LINE);
        sb.append(SPACE + "}" + LINE);
        sb.append(LINE);
    }
}

最終的結(jié)果如下:

在這里插入圖片描述

二. 反射方法的分析

2.1 反射的方式

代碼中我們可以發(fā)現(xiàn),這里提供了兩種基本的反射:

  • Class.forName()
  • getClassLoader().loadClass()

首先,在模板類中添加靜態(tài)塊代碼:

在這里插入圖片描述

再來運(yùn)行一下兩種反射方式的代碼:

forName

在這里插入圖片描述

getClassLoader

在這里插入圖片描述

結(jié)論如下:

初始化:通過forName方式反射的對象,會進(jìn)行初始化(會執(zhí)行靜態(tài)代碼),而通過getClassLoader方式反射的對象,是不會進(jìn)行初始化的。

2.2 修飾符的打印

如果想打印方法、屬性的修飾符,我們應(yīng)該通過Modifier類去拿到。請看這一行代碼:

String fieldModifier = Modifier.toString(field.getModifiers());

來看下Modifier.toString的源碼:

public static String toString(int mod) {
    StringBuilder sb = new StringBuilder();
    int len;

    if ((mod & PUBLIC) != 0)        sb.append("public ");
    if ((mod & PROTECTED) != 0)     sb.append("protected ");
    if ((mod & PRIVATE) != 0)       sb.append("private ");

    /* Canonical order */
    if ((mod & ABSTRACT) != 0)      sb.append("abstract ");
    if ((mod & STATIC) != 0)        sb.append("static ");
    if ((mod & FINAL) != 0)         sb.append("final ");
    if ((mod & TRANSIENT) != 0)     sb.append("transient ");
    if ((mod & VOLATILE) != 0)      sb.append("volatile ");
    if ((mod & SYNCHRONIZED) != 0)  sb.append("synchronized ");
    if ((mod & NATIVE) != 0)        sb.append("native ");
    if ((mod & STRICT) != 0)        sb.append("strictfp ");
    if ((mod & INTERFACE) != 0)     sb.append("interface ");

    if ((len = sb.length()) > 0)    /* trim trailing space */
        return sb.toString().substring(0, len-1);
    return "";
}

很明顯,其通過語言修飾符的類型(int類型)來做對應(yīng)的映射并返回。
案例代碼中有三塊地方都支持獲得修飾符類型:

  • field.getModifiers():字段修飾符。
  • constructor.getModifiers():構(gòu)造修飾符。
  • method.getModifiers():方法的修飾符。

2.3 getDeclaredxxx和getxxx的區(qū)別

以Field為例:

Field[] declaredFields = c.getDeclaredFields();
Field[] fields = c.getFields();

案例如下:
1.新建一個Parent類:

public class Parent {
    public String parentAddress;
    private Integer Number;
}

2.讓User類繼承Parent

在這里插入圖片描述

3.測試1:getDeclaredFields打印成員變量:

在這里插入圖片描述

4.測試2:getFields打印成員變量:

在這里插入圖片描述

兩者區(qū)別如下:

比較內(nèi)容 getDeclaredFields getFields
作用的類的范圍 僅僅限于當(dāng)前類 還可以包括父類
作用的修飾符范圍 可以獲取public和非public類型 只能獲得public類型的相關(guān)值

2.4 getSimpleName和getName有什么不同

以這行代碼為例:

String typeName = field.getType().getSimpleName();

若我將getSimpleName改為getName,看看輸出結(jié)果會有什么不同:

在這里插入圖片描述

可以發(fā)現(xiàn)gatName輸出的是這個類型的全名稱,那么對應(yīng)的getSimpleName就顧名思義,返回的是類型名稱。

對于其他的相關(guān)屬性和API,代碼的注釋都寫的比較詳細(xì)了,就不展開介紹了。

到此這篇關(guān)于Java通過反射來打印類的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java反射打印類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring web集成rabbitmq代碼實(shí)例

    Spring web集成rabbitmq代碼實(shí)例

    這篇文章主要介紹了Spring web集成rabbitmq代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 解決lombok的@Data注解無法打印繼承的父類信息問題

    解決lombok的@Data注解無法打印繼承的父類信息問題

    在Java編程中,使用@Data注解可能導(dǎo)致子類繼承父類屬性后,打印只顯示子類信息不顯示父類信息,問題源于@Data注解作用域僅限于當(dāng)前類,解決方法包括使用@ToString(callSuper=true)注解或重寫toString方法
    2024-11-11
  • Java 敏感詞檢測工具的實(shí)現(xiàn)

    Java 敏感詞檢測工具的實(shí)現(xiàn)

    本文介紹了Java敏感詞檢測工具的使用方法,包括依賴引入、核心方法使用實(shí)例、常規(guī)用法、自定義替換檢測策略等內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • 新手也能看懂的SpringBoot異步編程指南(簡單易懂)

    新手也能看懂的SpringBoot異步編程指南(簡單易懂)

    這篇文章主要介紹了新手也能看懂的SpringBoot異步編程指南(簡單易懂),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java使用EasyExcel模版導(dǎo)出詳細(xì)操作教程

    Java使用EasyExcel模版導(dǎo)出詳細(xì)操作教程

    業(yè)務(wù)中經(jīng)常需要按照一個特定的模板導(dǎo)出特定內(nèi)容,有些單元格還要求特殊的格式,所以下面這篇文章主要給大家介紹了關(guān)于Java使用EasyExcel模版導(dǎo)出的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • java編程題之順時針打印矩陣

    java編程題之順時針打印矩陣

    這篇文章主要為大家詳細(xì)介紹了java編程題之順時針打印矩陣,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • java根據(jù)模板導(dǎo)出PDF的詳細(xì)實(shí)現(xiàn)過程

    java根據(jù)模板導(dǎo)出PDF的詳細(xì)實(shí)現(xiàn)過程

    前段時間因?yàn)橄嚓P(guān)業(yè)務(wù)需求需要后臺生成pdf文件,所以下面這篇文章主要給大家介紹了關(guān)于java根據(jù)模板導(dǎo)出PDF的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • 2019年最新Java學(xué)習(xí)路線圖

    2019年最新Java學(xué)習(xí)路線圖

    不管你是不懂電腦的小白,還是已經(jīng)步入開發(fā)的大牛,這套路線路絕對不容錯過,路線圖的宗旨就是分享,專業(yè),便利,讓喜愛Java的人,都能平等的學(xué)習(xí),感興趣的同學(xué)可以了解一下
    2019-03-03
  • Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析

    Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析

    這篇文章主要介紹了Java中的volatile實(shí)現(xiàn)機(jī)制詳細(xì)解析,本文的主要內(nèi)容就在于要理解volatile的緩存的一致性協(xié)議導(dǎo)致的共享變量可見性,以及volatile在解析成為匯編語言的時候?qū)ψ兞考渔i兩塊理論內(nèi)容,需要的朋友可以參考下
    2024-01-01
  • 詳解Java使用JDBC連接MySQL數(shù)據(jù)庫

    詳解Java使用JDBC連接MySQL數(shù)據(jù)庫

    本文詳細(xì)講解了Java使用JDBC連接MySQL數(shù)據(jù)庫的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01

最新評論

静乐县| 永昌县| 马龙县| 静安区| 兴城市| 沧源| 贡山| 刚察县| 德保县| 水富县| 两当县| 裕民县| 天水市| 米泉市| 英超| 都兰县| 乐都县| 浦北县| 文登市| 阿拉善盟| 城口县| 崇阳县| 穆棱市| 拉萨市| 池州市| 贵德县| 德安县| 阿勒泰市| 岳池县| 长治市| 屏山县| 和林格尔县| 新沂市| 渝北区| 永年县| 普定县| 鹿泉市| 金华市| 贵南县| 长阳| 邳州市|