国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

反射的作用( 越過泛型檢查 和 可以使用反射保存所有對象的具體信息 )

這篇具有很好參考價值的文章主要介紹了反射的作用( 越過泛型檢查 和 可以使用反射保存所有對象的具體信息 )。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、繞過 編譯階段 為集合添加數(shù)據(jù)

  • 反射是作用在運行時的技術(shù),此時集合的泛型將不能產(chǎn)生約束了,此時是可以 為集合存入其他任意類型的元素的 。
  • 泛型只是在編譯階段可以約束集合只能操作某種數(shù)據(jù)類型,在 編譯成Class文件進入 運行階段 的時候,其真實類型都是不帶泛型的集合,泛型相當(dāng)于被擦除了。
package com.csdn.d6_reflect_genericity;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class ReflectDemo {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //需求:反射實現(xiàn)泛型擦除后,加入其他類型的元素
        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();

        System.out.println(list1.getClass());//class java.util.ArrayList
        System.out.println(list2.getClass());//class java.util.ArrayList

        System.out.println(list1.getClass() == list2.getClass());//true

        System.out.println("===============================");

        ArrayList<Integer> list3 = new ArrayList<>();
        list3.add(23);
        list3.add(22);

        Class<? extends ArrayList> aClass = list3.getClass();

        Method add = aClass.getDeclaredMethod("add", Object.class);
        boolean rs = (boolean) add.invoke(list3, "反射");
        System.out.println(rs);//true

        System.out.println(list3);//[23, 22, 反射]

        ArrayList list4 = list3;
        list4.add("注解");
        list4.add(false);
        System.out.println(list3);//[23, 22, 反射, 注解, false]

    }
}

1.1、反射為何可以給約定了泛型的集合存入其他類型的元素?

  • 編譯成Class文件進入運行階段 的時候,泛型會自動擦除 。
  • 反射是作用在 運行時 的技術(shù),此時已經(jīng)不存在泛型了 。

?2、通用框架的底層原理

需求

  • 給定任意一個對象,在不清楚對象字段的情況下,可以把對象的字段名稱和對應(yīng)值存儲到文件中去。

分析

  1. 定義一個 方法 ,可以接收任意類的對象
  2. 每次收到一個對象后,需要解析這個對象的 全部成員變量名稱
  3. 這個對象可能是 任意 的,那么怎么樣才可以知道這個對象的全部成員變量名稱呢
  4. 使用 反射 獲取對象的 Class類對象 ,然后獲取全部成員變量信息
  5. 遍歷成員變量信息,然后提取本成員變量在對象中的 具體值
  6. 存入成員變量名稱和值到 文件 中去即可
package com.csdn.d7_reflect_framework;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;
/**
 * 目標(biāo):提供一個通用框架,支持保存所有對象的具體信息。
 */
public class ReflectDemo {
    public static void main(String[] args) {
        Student student = new Student("反射", '男', 100, "JavaSE", "暴力訪問");
        MybatisUtil.save(student);

        Teacher teacher = new Teacher("注解", '女', 10000);
        MybatisUtil.save(teacher);
    }
}

class MybatisUtil {
    public static void save(Object object) {
        try {
            try (PrintStream ps = new PrintStream(new FileOutputStream("reflect\\src\\main\\java\\com\\csdn\\d7_reflect_framework\\object.txt",true))) {
                //1、提取這個對象的全部成員變量:只能反射可以解決
                Class<?> aClass = object.getClass();
                ps.println("==============" + aClass.getSimpleName() + "================");

                //2、提取它的全部成員變量
                Field[] fields = aClass.getDeclaredFields();
                //3、獲取成員變量的信息
                for (Field field : fields) {
                    String name = field.getName();
                    //提取本成員變量的object對象中的值(取值)
                    field.setAccessible(true);

                    String value = field.get(object) + "";

                    ps.println(name + "=" + value);

                }
            }
        } catch (IllegalAccessException | FileNotFoundException e) {
            throw new RuntimeException(e);
        }

    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Student {
    private String name;
    private char sex;
    private int age;
    private String className;
    private String hobby;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
class Teacher {
    private String name;
    private char sex;
    private double salary;
}

?反射的作用( 越過泛型檢查 和 可以使用反射保存所有對象的具體信息 ),# 反射 和 注解,反射,getClass(),invoke()文章來源地址http://www.zghlxwxcb.cn/news/detail-721755.html

?3、反射的作用?

  • 可以在運行時得到一個 類的 全部成分 然后操作
  • 可以 破壞封裝性(很突出)
  • 也可以 破壞泛型的約束性(很突出)
  • 更重要的用途是適合:做 Java 高級框架

到了這里,關(guān)于反射的作用( 越過泛型檢查 和 可以使用反射保存所有對象的具體信息 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Scala中的類型檢查和轉(zhuǎn)換,以及泛型,scala泛型的協(xié)變和逆變

    說明 (1) obj.isInstanceOf[T]:判斷 obj 是不是T 類型。 (2) obj.asInstanceOf[T]:將 obj 強轉(zhuǎn)成 T 類型。 (3) classOf 獲取對象的類名。 案例 1.說明 (1)枚舉類:需要繼承 Enumeration (2)應(yīng)用類:需要繼承App 2. 案例 1.說明 使用 type 可以定義新的數(shù)據(jù)數(shù)據(jù)類型名稱,本質(zhì)上就

    2024年02月10日
    瀏覽(23)
  • spring boot 使用AOP+自定義注解+反射實現(xiàn)操作日志記錄修改前數(shù)據(jù)和修改后對比數(shù)據(jù),并保存至日志表

    spring boot 使用AOP+自定義注解+反射實現(xiàn)操作日志記錄修改前數(shù)據(jù)和修改后對比數(shù)據(jù),并保存至日志表

    使用FieldMeta自定義注解,看個人業(yè)務(wù)自行覺得是否需要重新定義實體 實現(xiàn)類 :通過該實現(xiàn)類獲取更新前后的數(shù)據(jù)。 該實現(xiàn)類的實現(xiàn)原理為:獲取入?yún)⒊鋈氲膇d值,獲取sqlSessionFactory,通過sqlSessionFactory獲取selectByPrimaryKey()該方法,執(zhí)行該方法可獲取id對應(yīng)數(shù)據(jù)更新操作前后的數(shù)

    2024年01月23日
    瀏覽(29)
  • 使用JavaScript實現(xiàn)保存文件,用戶可以自己選擇本地路徑

    但是,此API目前仍處于實驗階段,可能并不在所有瀏覽器中都得到完全支持。 瀏覽器的權(quán)限是很低的,是不能與操作系統(tǒng)實現(xiàn)交互,只有少量的api可以與操作系統(tǒng)交互,例如文件上傳。但是,軟件是有很高的權(quán)限的,例如,迅雷下載就可以輕松實現(xiàn),下載到指定目錄。 但是

    2024年02月03日
    瀏覽(27)
  • String、反射、枚舉、lambda表達(dá)式以及泛型進階(數(shù)據(jù)結(jié)構(gòu)系列16)

    String、反射、枚舉、lambda表達(dá)式以及泛型進階(數(shù)據(jù)結(jié)構(gòu)系列16)

    目錄 前言: 1. String 1.1 字符串常量池 1.1.1?創(chuàng)建對象的思考 1.1.2?字符串常量池(StringTable) 1.1.3?再談String對象創(chuàng)建 1.1.4?intern方法 2.?反射 2.1?反射的定義 2.2 反射的用途 2.3 反射的基本信息 2.4 反射相關(guān)的類 2.4.1?Class類(反射機制的起源) 2.4.1.1?Class類中的相關(guān)方法 2.5?反

    2024年02月11日
    瀏覽(28)
  • 反射的作用

    反射的作用

    獲取一個類里面所有的信息,獲取到了之后,再執(zhí)行其他的業(yè)務(wù)邏輯 結(jié)合配置文件,動態(tài)的創(chuàng)建對象并調(diào)用方法 準(zhǔn)備一個info.properties文件,以鍵值對的形式存儲 以后若要運行其他類里面的方法,在文件內(nèi)修改數(shù)據(jù)即可 將文件修改為如下,再次運行 總結(jié):

    2024年02月19日
    瀏覽(16)
  • C++ 使用 GDI+ 實現(xiàn)格式為bmp的圖像內(nèi)存轉(zhuǎn)為jpg格式,并且可以實現(xiàn)旋轉(zhuǎn)保存

    將獲取的bmp內(nèi)存數(shù)據(jù),經(jīng)過轉(zhuǎn)換成jpg格式,根據(jù)自己的需求可以對圖像先做旋轉(zhuǎn),再進行保存,主要用到的是GDI+工具。 函數(shù)的說明 /// /獲取的圖像內(nèi)存數(shù)據(jù) /// /圖像的像素位數(shù) /// /圖像的寬度 /// /圖像的高度 /// /圖像保存的路徑 /// /圖像保存的路徑加圖像名稱 ///

    2024年02月16日
    瀏覽(18)
  • Java 中的泛型是什么,它有什么作用?(十五)

    Java中的泛型是一種類型參數(shù)化機制,它使代碼更具可讀性、可重用性和穩(wěn)健性。在Java中,通過使用泛型,可以將類型作為參數(shù)傳遞給類或方法,并在編譯時執(zhí)行類型檢查,從而避免許多運行時錯誤。 泛型的基礎(chǔ) Java泛型的基礎(chǔ)概念是類型變量、類型參數(shù)和類型邊界。 類型變

    2024年02月03日
    瀏覽(26)
  • vitepress項目使用github的action自動部署到github-pages中,理論上可以通用所有

    vitepress項目使用github的action自動部署到github-pages中,理論上可以通用所有

    .githubworkflowsdeploy.yml 完整的代碼:使用的是 pnpm 進行依賴安裝。 這段 YAML 文件定義了一個 GitHub Actions 工作流,用于在推送到 docs 分支時構(gòu)建和部署 VitePress 項目。 on : 定義觸發(fā)工作流的事件,這里是在推送到 docs 分支時觸發(fā)。 jobs : 定義工作流中的任務(wù)。 build-and-deploy : 任務(wù)

    2024年01月17日
    瀏覽(32)
  • python3 強制使用任意父級相對導(dǎo)入,越過python相對導(dǎo)入限制,拒絕 ImportError

    單純不喜歡 python 對 點開頭的包的限制,好麻煩,遂寫了本包,來解決這個問題 啟用本模塊后,你可以隨時使用 單個點來導(dǎo)入當(dāng)前目錄的模塊,也可以使用多個 點導(dǎo)入多級父目錄內(nèi)的模塊,而不會報錯煩人的模塊相對路徑限制錯誤。 寫了一個強制相對導(dǎo)入特性,修改了 i

    2024年02月01日
    瀏覽(15)
  • 題目:1893.檢查是否區(qū)域內(nèi)所有整數(shù)都被覆蓋

    ?? 題目來源: ? ? ? ? leetcode題目,網(wǎng)址:1893. 檢查是否區(qū)域內(nèi)所有整數(shù)都被覆蓋 - 力扣(LeetCode) 解題思路: ? ? ? ?start 和 end 的取值范圍是 1- 50,因此可以使用比特位位數(shù)為 64 的 Long 來表示,第 i 位為 1表示 i 在范圍內(nèi),否則不在。 ? ? ? ? ?獲得范圍后,通過邏輯

    2024年02月12日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包