反射 p4 反射獲取類的結構信息

来源:https://www.cnblogs.com/zh-Note/archive/2023/07/25/17557511.html
-Advertisement-
Play Games

# 反射獲取類的結構信息 1. **關於Class的API** 1. getName:獲取全類名 2. getSimpleName:獲取簡單類名 3. getFields:獲取所有Public修飾的屬性,包含本類及其父類(不僅僅是直接父類) 4. getDeclaredFields:獲取本類中的所有 ...


反射獲取類的結構信息

  1. 關於Class的API

    1. getName:獲取全類名
    2. getSimpleName:獲取簡單類名
    3. getFields:獲取所有Public修飾的屬性,包含本類及其父類(不僅僅是直接父類)
    4. getDeclaredFields:獲取本類中的所有屬性,不包括父類
    5. getMethods:獲取所有public修飾的方法,包含本類及其父類的(不僅僅是直接父類)
    6. getDeclaredMethods:獲取本類中所有方法,不包括父類
    7. getConstructors:獲取所有public修飾的構造器,不包括父類
    8. getDeclaredConstructors:獲取本類中的所有構造器,不包括父類,構造器不能被繼承
    9. getPackage:以Package形式返回包信息
    10. getSuperClass:以Class形式返回父類信息
    11. getInterface:以Class[]形式返回介面信息,不包括父類
    12. getAnnotations:以Annotation[]形式返回註解信息
  2. 關於Field的API

    1. getModifiers:以int的形式返回修飾符
      規定說明:預設修飾符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
    2. getType:以Class形式返回屬性類型
    3. getName:獲得屬性名
  3. 關於Method的API

    1. getModifiers:以int的形式返回修飾符
      規定說明:預設修飾符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
    2. getReturnType:以Class形式返回方法返回值類型
    3. getName:獲得方法名
    4. getParameterTypes:以Class[]形式返回方法的形參列表
  4. 關於Constructor的API

    1. getModifiers:以int的形式返回修飾符
      規定說明:預設修飾符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
    2. getName:獲得構造器名
    3. getParameterTypes:以Class[]形式返回構造器的形參列表
  5. 案例演示

    package com.hspedu.reflection;
    
    
    import org.junit.Test;
    
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    /**
     * @author: 86199
     * @date: 2023/6/4 10:42
     * @description: 演示如何通過反射獲取類的結構信息
     */
    public class ReflectionUtils {
        public static void main(String[] args) throws ClassNotFoundException {
            ReflectionUtils reflectionUtils = new ReflectionUtils();
            System.out.println("========================api_01()=======================");
            reflectionUtils.api_01();
            System.out.println("========================api_02()=======================");
            reflectionUtils.api_02();
    
        }
    
        //第一組方法API:java.lang.Class
        @Test
        public void api_01() throws ClassNotFoundException {
            //得到Class對象
            Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
            //1. getName:獲取全類名
            System.out.println(personCls.getName());//com.hspedu.reflection.Person
            //2. getSimpleName:獲取簡單類名
            System.out.println(personCls.getSimpleName());//Person
            //3. getFields:獲取所有Public修飾的屬性,包含本類及其父類(不僅僅是直接父類)
            for (Field field : personCls.getFields()) {
                System.out.println("本類及父類的公有屬性"+ field.getName());
            }
            //4. getDeclaredFields:獲取本類中的所有屬性,不包括父類
            for (Field declaredField : personCls.getDeclaredFields()) {
                System.out.println("本類中所有屬性" + declaredField.getName());
            }
            //5. getMethods:獲取所有public修飾的方法,包含本類及其父類的(不僅僅是直接父類)
            for (Method method : personCls.getMethods()) {
                System.out.println("本類及其父類的公有方法 = " + method);
            }
            //6. getDeclaredMethods:獲取本類中所有方法,不包括父類
            for (Method declaredMethod : personCls.getDeclaredMethods()) {
                System.out.println("本類的方法 = " + declaredMethod);
            }
            //7. getConstructors:獲取所有public修飾的構造器,不包括父類
            for (Constructor<?> constructor : personCls.getConstructors()) {
                System.out.println("本類的public構造器 = " + constructor);
            }
            //8. getDeclaredConstructors:獲取本類中的所有構造器,不包括父類,構造器不能被繼承
            for (Constructor<?> declaredConstructor : personCls.getDeclaredConstructors()) {
                System.out.println("本類的所有構造器 = " + declaredConstructor);
            }
            //9. getPackage:以Package形式返回包信息
            System.out.println(personCls.getPackage());//package com.hspedu.reflection
            //10. getSuperClass:以Class形式返回父類信息
            System.out.println("父類的class對象 = " + personCls.getSuperclass());//父類的class對象 = class com.hspedu.reflection.A
            //11. getInterface:以Class[]形式返回介面信息,不包括父類
            for (Class<?> anInterface : personCls.getInterfaces()) {
                System.out.println("介面信息 = " + anInterface);
            }
            //12.getAnnotations:以Annotation[]形式返回註解信息
            for (Annotation annotation : personCls.getAnnotations()) {
                System.out.println("註解信息 = " + annotation);
            }
        }
    
        //第二組方法API:java.lang.reflect.Filed,java.lang.reflect.Method
        @Test
        public void api_02() throws ClassNotFoundException {
            //得到Class對象
            Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
            //1. getModifiers():以int的形式返回修飾符
            //規定說明:預設修飾符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
            //2. getType:以Class形式返回屬性類型
            //3. getName:獲得屬性名
            for (Field declaredField : personCls.getDeclaredFields()) {//獲得Field[]
                System.out.println("本類中所有屬性 " + declaredField.getName() + " 屬性的修飾符值 " + declaredField.getModifiers()
                + "該屬性的類型 " + declaredField.getType());
            }
    
            //1. getModifiers():以int的形式返回修飾符
            //規定說明:預設修飾符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
            //2. getReturnType:以Class形式返回方法返回值類型
            //3. getName:獲得方法名
            //4. getParameterTypes:以Class[]形式返回方法的形參列表
            for (Method declaredMethod : personCls.getDeclaredMethods()) {//獲得Method[]
                System.out.print("本類的方法 = " + declaredMethod.getName() + " 方法的修飾符值 " + declaredMethod.getModifiers()
                        + "該方法返回值的類型 " + declaredMethod.getReturnType() + " 方法的參數 ");
                //輸出方法的形參數組
                for (Class<?> parameterType : declaredMethod.getParameterTypes()) {
                    System.out.print(parameterType + " ");
                }
                System.out.println();
            }
    
    
            //1. getModifiers():以int的形式返回修飾符
            //規定說明:預設修飾符是 0, public 是 1, protect 是 2, private 是 4 , static 是 8, final 是 16
            //2. getName:獲得構造器名
            //4. getParameterTypes:以Class[]形式返回構造器的形參列表
            for (Constructor<?> constructor : personCls.getDeclaredConstructors()) {//獲取Constructor[]
                System.out.print("本類的public構造器 = " + constructor.getName());
                for (Class<?> parameterType : constructor.getParameterTypes()) {
                    System.out.print(" 該構造器的形參類型" +  parameterType + "   ");
                }
                System.out.println();
            }
        }
    }
    
    
    class A{
        public String hobby;
        public A() {
        }
        public void hi(){}
    }
    
    interface IA{}
    interface IB{}
    
    @Deprecated
    class Person extends A implements IA,IB{
        //屬性
        public String name;
        String job;
        protected  int age;
        private double sal;
    
        //構造器
        public Person() {
        }
    
        private Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public Person(String name) {
            this.name = name;
        }
    
        //方法
        public void m1(String name, int age, double sal){}
        protected String m2(){ return  null; }
        void m3(){}
        private void m4(){}
    }
    
    
    /* 運行結果
    ========================api_01()=======================
    com.hspedu.reflection.Person
    Person
    本類及父類的公有屬性name
    本類及父類的公有屬性hobby
    本類中所有屬性name
    本類中所有屬性job
    本類中所有屬性age
    本類中所有屬性sal
    本類及其父類的公有方法 = public void com.hspedu.reflection.Person.m1(java.lang.String,int,double)
    本類及其父類的公有方法 = public void com.hspedu.reflection.A.hi()
    本類及其父類的公有方法 = public final void java.lang.Object.wait() throws java.lang.InterruptedException
    本類及其父類的公有方法 = public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
    本類及其父類的公有方法 = public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
    本類及其父類的公有方法 = public boolean java.lang.Object.equals(java.lang.Object)
    本類及其父類的公有方法 = public java.lang.String java.lang.Object.toString()
    本類及其父類的公有方法 = public native int java.lang.Object.hashCode()
    本類及其父類的公有方法 = public final native java.lang.Class java.lang.Object.getClass()
    本類及其父類的公有方法 = public final native void java.lang.Object.notify()
    本類及其父類的公有方法 = public final native void java.lang.Object.notifyAll()
    本類的方法 = void com.hspedu.reflection.Person.m3()
    本類的方法 = private void com.hspedu.reflection.Person.m4()
    本類的方法 = protected java.lang.String com.hspedu.reflection.Person.m2()
    本類的方法 = public void com.hspedu.reflection.Person.m1(java.lang.String,int,double)
    本類的public構造器 = public com.hspedu.reflection.Person(java.lang.String)
    本類的public構造器 = public com.hspedu.reflection.Person()
    本類的所有構造器 = public com.hspedu.reflection.Person(java.lang.String)
    本類的所有構造器 = private com.hspedu.reflection.Person(java.lang.String,int)
    本類的所有構造器 = public com.hspedu.reflection.Person()
    package com.hspedu.reflection
    父類的class對象 = class com.hspedu.reflection.A
    介面信息 = interface com.hspedu.reflection.IA
    介面信息 = interface com.hspedu.reflection.IB
    註解信息 = @java.lang.Deprecated()
    ========================api_02()=======================
    本類中所有屬性 name 屬性的修飾符值 1該屬性的類型 class java.lang.String
    本類中所有屬性 job 屬性的修飾符值 0該屬性的類型 class java.lang.String
    本類中所有屬性 age 屬性的修飾符值 4該屬性的類型 int
    本類中所有屬性 sal 屬性的修飾符值 2該屬性的類型 double
    本類的方法 = m3 方法的修飾符值 0該方法返回值的類型 void 方法的參數 
    本類的方法 = m4 方法的修飾符值 2該方法返回值的類型 void 方法的參數 
    本類的方法 = m2 方法的修飾符值 4該方法返回值的類型 class java.lang.String 方法的參數 
    本類的方法 = m1 方法的修飾符值 1該方法返回值的類型 void 方法的參數 class java.lang.String int double 
    本類的public構造器 = com.hspedu.reflection.Person 該構造器的形參類型class java.lang.String   
    本類的public構造器 = com.hspedu.reflection.Person 該構造器的形參類型class java.lang.String    該構造器的形參類型int   
    本類的public構造器 = com.hspedu.reflection.Person
    */
    

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #【後端面經-Spring】Spring簡介 [TOC](【後端面經-Spring】Spring簡介) ## 1. Spring簡介 Spring是為了簡化java項目開發設計的一款設計層面開源框架,其設計目的就是為了“簡化開發”。 它使用分層架構,解決業務邏輯層和各層之間的松耦合。 核心特性: - ...
  • antv-x6是一個功能強大、可擴展性高的可視化工具,提供了一系列開箱即用的交互軟體和簡單易用的節點定製能力,能夠幫助使用者便捷地創建流程圖、ER圖等交互性較強的應用。本次分享介紹了x6的基本功能,更多高級功能有待我們進一步學習和探索。 ...
  • 高可用的三大利器是熔斷、限流和降級。它們都是在分散式系統中用於保障系統穩定性和可用性的重要策略。熔斷(Circuit Breaker):熔斷是一種防止故障擴散的機制。當一個服務出現故障或超時,熔斷器會打開並快速失敗,拒絕後續的請求,避免請求堆積和資源耗盡。熔斷器會暫時屏蔽該服務,併在一段時間後嘗試恢... ...
  • Docker CLI (命令行界面) 是一個強大的工具,可讓您與 Docker 容器、映像、捲和網路進行交互和管理。它為用戶提供了廣泛的命令,用於在其開發和生產工作流中創建、運行和管理 Docker 容器和其他 Docker 資源。 ### 安裝 要開始使用 Docker CLI,您需要在電腦上安 ...
  • # 未定義行為之 NULL dereference 下麵這段代碼中 `is_valid()` 解引用了空指針 `str`,我們的直覺是編譯運行後將迎來 SIGSEGV,然而事情並非所期望的那樣。 ```c /* * ub_null.c - 未定義行為演示 之 NULL dereference */ ...
  • 本專題寫作的目的其實是分享go語言編程的使用場景,介紹go語言編程的方方面面,讓大家能夠用好這個由google公司發明的強力工具,提升大家在這方面的生產力,畢竟**”君子善假與物也“**嘛。 這裡我先說明一下,我並不是一個對go語言的所有一切都認同的人,你會發現很多相關從業者也會吐槽go語言的“專制 ...
  • # **反射相關使用和暴破** ## **通過反射創建對象** 1. **方式一:**調用類中的public修飾的無參構造器; 2. **方式二:**調用類中的指定構造器; 3. **Class類相關方法:** - newInstance():調用類中的無參構造器,獲取對應類的對象; - getCo ...
  • 原文在[這裡](https://grpc.io/docs/languages/go/basics/)。 本教程為Go程式員提供了使用gRPC的基本介紹。 通過跟隨本示例,你將學會如何: - 在.proto文件中定義一個服務。 - 使用協議緩衝編譯器生成伺服器和客戶端代碼。 - 使用Go gRPC A ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...