反射(二)

来源:https://www.cnblogs.com/qingmu1412/archive/2020/03/05/12423185.html
-Advertisement-
Play Games

反射(二) 通過慄子來更好的理解反射,以及對反射技術進行應用。 首先,整兩個model——car.java和Benz.java 獲取反射類的幾種方法 反射——類的操作 反射——方法操作 反射——構造器操作 最後,要寫一個main方法,調用以上幾個方法,感受一下效果 ...


反射(二)

通過慄子來更好的理解反射,以及對反射技術進行應用。

首先,整兩個model——car.java和Benz.java

public class Car {
    public String type;
    private String color;


    public static void drive(){
        System.out.println("The car is driving");
    }


}
public class Benz extends Car {
    public String brand;
    private String model;
    private int sale;

    public static String text;

    public Benz() {
    }

    private Benz(String brand) {
        this.brand = brand;
    }

    public Benz(String brand, String model) {
        this.brand = brand;
        this.model = model;
    }

    public int getSale() {
        return sale;
    }

    public String getBrand() {
        return brand;
    }

    public static void desc(){
        System.out.println("這是一輛黑色的賓士車");
    }

    public void getModel(String model){
        System.out.println("這輛賓士車的型號是:"+model);
    }
    private void getColor(){
        System.out.println("這輛車的顏色是黑色");
    }
}

獲取反射類的幾種方法

//1.獲取class對象實例
        //1.1 類名.class
        Class clazz=Car.class;
        //1.2 new一個實體,通過getClass()方法
        Class clazz2=new Car().getClass();
        //1.3 Class.forname()類名全路徑
        try {
            Class clazz3=Class.forName("com.qingmu.reflect.Demo1.Car");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //1.4 通過ClassLoader獲取
        try {
            Class clazz4= Main.class.getClassLoader().loadClass("com.qingmu.reflect.Demo1.Car");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

反射——類的操作

public static void classOpt(){
        Class clazz=Car.class;
        //獲取類的修飾符
        int modifers=clazz.getModifiers();
        System.out.println("類的修飾符:"+modifers);
        //獲取類的包名
        Package packag=clazz.getPackage();
        System.out.println("包名:"+packag);
        //獲取類的全路徑名
        String name = clazz.getName();
        System.out.println(name);
        //獲取類名
        String simpleName = clazz.getSimpleName();
        System.out.println(simpleName);
        //獲取類的載入器
        ClassLoader classLoader = clazz.getClassLoader();
        System.out.println(classLoader);
        //獲取類的實現的介面列表
        Class[] interfaces = clazz.getInterfaces();
        System.out.println(interfaces.length);
        //獲取類的父類
        Class superclass = clazz.getSuperclass();
        System.out.println(superclass);
        //獲取類的註解列表
        Annotation[] annotation = clazz.getAnnotations();
        System.out.println(annotation.length);
    }

反射——方法操作

//反射欄位的基本操作
    public static void filedOpt(){
        Class clazz=new Benz().getClass();
        //獲取類中所有的公有欄位 包含繼承
        Field[] fields = clazz.getFields();
        for (Field filed: fields) {
            System.out.println(filed);
        }
        //獲取指定名稱的欄位
        try {
            Field brandField=clazz.getField("brand");   //公有欄位
            System.out.println(brandField.getName());
            Field sale = clazz.getDeclaredField("sale");    //所有類型欄位
            System.out.println(sale.getName());
            int modifiers = brandField.getModifiers();      //獲取欄位的修飾
            System.out.println(modifiers);
            System.out.println(sale.getModifiers());
            //強制訪問私有欄位
            sale.setAccessible(true);
            //成員欄位賦值
            Benz benz= (Benz) clazz.newInstance();
            sale.set(benz,5000000);
            System.out.println(benz.getSale());
            //靜態欄位賦值
            Field textField=clazz.getField("text");
            textField.set(null,"這是一個靜態欄位");
            System.out.println(Benz.text);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        //獲取類中定義的所有欄位 內部
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field filed:declaredFields) {
            System.out.println(filed);
        }
    }

反射——構造器操作

public static void constructorOpt() throws Exception{
        Class clazz=Benz.class;
        Benz benz= (Benz) clazz.newInstance();

        //獲取類中所有的公有構造器
        Constructor[] constructors =clazz.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        //獲取類中所有的構造器
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }

        //獲取類中無參構造器及修飾符
        Constructor declaredConstructor = clazz.getDeclaredConstructor();
        System.out.println(declaredConstructor+"--"+declaredConstructor.getModifiers());

        //獲取類中有參構造器
        Constructor declaredConstructor1 = clazz.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor1);

        declaredConstructor1.setAccessible(true);
        Benz benz1 = (Benz) declaredConstructor1.newInstance("benz");  //構造器實例對象
        System.out.println(benz1.brand);
    }

最後,要寫一個main方法,調用以上幾個方法,感受一下效果


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

-Advertisement-
Play Games
更多相關文章
  • 今日內容 1、mro演算法和super super()表示執行父類的方法。 2、正則表達式和re模塊 1. re模塊本身只是用來操作正則表達式。 (1)正則表達式 匹配字元串 表單驗證 爬蟲 (4)正則表達式規則(元字元,量詞) 3、量詞 ...
  • 一、正則常用的方法 1.match:從開始位置開始查找,一次匹配 2.sear​ch:從任何位置查找,一次匹配 3.findall​:全部匹配,返回列表 4.finditer​:全部匹配,返回迭代器 5.​split:分割字元串,返回列表 ​6.sub:替換 7.匹配中文 中文unicode編碼[u ...
  • Socket(套接字) 介紹 UDP 和 TCP 協議之前,先熟悉下 socket 的基本概念。 基本概念 Socket 是通信的基石,是支持 TCP/IP 協議的網路通信的基本操作單元,在網路通信過程中端點的一種抽象表示。網路中使用 Socket 傳輸數據是一種特殊的網路 I/O。 工作模式 打開 ...
  • qsort()函數的使用 qsort()函數是 C 庫中實現的快速排序演算法,包含在 頭文件中,其時間複雜度為 O(nlogn)。函數原型如下: 此函數需要四個參數。 第一個參數是需要排序的數組的基地址,因為是 類型,所以此函數可以給任何類型的數組進行排序; 第二個參數是待排序的數量(size_t 是 ...
  • 基於SSM開發校園外賣零食購物商城系統 開發環境: Windows操作系統開發工具: Eclipse+Jdk+Tomcat+MySql資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=113 ...
  • 基於Struts2開發寵物領養系統的設計與實現 開發環境: Windows操作系統開發工具:MyEclipse+Jdk+Tomcat+MySQL資料庫運行效果圖 源碼及原文鏈接:https://javadao.xyz/forum.php?mod=viewthread&tid=116 ...
  • 函數只能面向過程,來回互相調用後順序執行, 簡單的編碼項目,還能應付的過來, 複雜的大型項目,調用多了,就會亂。 如何才能不亂呢,可嘗試下, 面向對象類的概念, 將現實世界的事物抽象成對象,將現實世界中事物的關係抽象成類, 即要秉著“萬物皆對象,一切皆可歸類”的中心思想, 去建立你的代碼模型。 一聽 ...
  • 輸入年份,列印出該年的日曆: #include <stdio.h> void PrintEnter(int mod); void PrintSkip(int lastday); void PrintTitle(int year,int month); int JudgeDays(int year, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...