反射之通過反射瞭解集合泛型的本質

来源:http://www.cnblogs.com/format-ch/archive/2017/06/04/6940579.html
-Advertisement-
Play Games

本文接上文"反射之方法反射的基本操作",利用反射瞭解下java集合中泛型的本質 1、初始化兩個集合,一個使用泛型,一個不使用 2、有定義類型可得在list2中添加int類型會報錯 3、獲取兩個對象的類類型進行比較 通過c1==c2結果返回true,說明編譯之後集合的泛型是去泛型化的,java中集合的 ...


 

本文接上文"反射之方法反射的基本操作",利用反射瞭解下java集合中泛型的本質

1、初始化兩個集合,一個使用泛型,一個不使用

1 ArrayList list1 = new ArrayList();
2 ArrayList<String> list2 = new ArrayList<String>();

2、有定義類型可得在list2中添加int類型會報錯

1 list2.add("Hello");
2 list2.add(20);   //報錯

3、獲取兩個對象的類類型進行比較

1 Class c1 = list1.getClass();
2 Class c2 = list2.getClass();
3 System.out.println(c1 == c2);

通過c1==c2結果返回true,說明編譯之後集合的泛型是去泛型化的,java中集合的泛型是為了防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了

4、驗證:通過方法的反射來繞過編譯

1 try {
2     Method m = c2.getMethod("add", Object.class);
3     m.invoke(list2,20);
4     System.out.println(list2);
5 } catch (Exception e) {
6     e.printStackTrace();
7 }

5、輸出結果

6、完整代碼

 1 package com.format.test;
 2 
 3 import java.lang.reflect.Method;
 4 import java.util.ArrayList;
 5 
 6 /**
 7  * Created by Format on 2017/6/4.
 8  */
 9 public class Test2 {
10     public static void main(String[] args) {
11         ArrayList list1 = new ArrayList();
12         ArrayList<String> list2 = new ArrayList<String>();
13         list2.add("Hello");
14 //        list2.add(20);   //報錯
15         Class c1 = list1.getClass();
16         Class c2 = list2.getClass();
17         System.out.println(c1 == c2);
18         /**
19          * 反射操作都是編譯之後的操作
20          * c1==c2結果返回true,說明編譯之後集合的泛型是去泛型化的
21          * java中集合的泛型是為了防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了
22          * 驗證:通過方法的反射來繞過編譯
23          */
24         try {
25             Method m = c2.getMethod("add", Object.class);
26             m.invoke(list2,20);
27             System.out.println(list2);
28         } catch (Exception e) {
29             e.printStackTrace();
30         }
31     }
32 }
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 繼續上一篇文章的內容,上一篇文章中已經將url管理器和下載器寫好了。接下來就是url解析器,總的來說這個模塊是幾個模塊中比較難的。因為通過下載器下載完頁面之後,我們雖然得到了頁面,但是這並不是我們想要的結果。而且由於頁面的代碼很多,我們很難去裡面找到自己想要的數據。所幸,我們下載的是html頁面,它 ...
  • 如此簡單(不安全)的登錄表單已經不多見了。字幕庫的登錄表單如下所示,其中省去了無關緊要的內容: 通過抓包分析,可以發現用戶名和密碼都沒有被加密: 直接使用POST來模擬登錄: 成功登錄,分析返回頁面中的js代碼,發現有: 說明要跳轉到的頁面在id為href的超鏈接中: 獲取要跳轉到的頁面,然後嘗試打 ...
  • Provider(MessageProvider):生產者Consumer(MessageConsumer):消費者PTP:Point to Point,即點對點的消息模型Pub/Sub:Publish/Subscribe,即發佈/訂閱的消息模型Queue:隊列目標Topic:主題目標Connect ...
  • 這一次,本K帶大家來看一下關於PHP中數組、字元串的一些註意事項和函數(方法)。 一、PHP中的數組 (一)PHP中的數組簡介 數組類型是PHP兩種複合數據類型之一。根據下標的不同,可以將PHP中的數組分成關聯數組和索引數組:前者指下標為字元串格式,每個下標字元串與數組的值一一對應;後者下標為數字, ...
  • 一 概述 1.什麼是監聽器? 監聽Web伺服器的運行,當發生特定的事件時,採取預先設定的處理措施的組件。 2.監聽器的作用 監聽器提供了一種獲取伺服器運行狀況、動態干預的方式,伺服器在運行期間發生指定變化時及時介入干預。 3.監聽類型 Servlet規範主要提供了用於監控application\se ...
  • 進程與線程 進程是程式(任務)的執行過程,具有動態性;持有資源(共用記憶體、共用文件)和線程,是資源和線程的載體。 線程是系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。 線程的交互,交互的方式包括互斥與同步。 線程的常用方法 java對線程的支持主要體現在類Thread和介面Runn ...
  • /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open ...
  • 【PHP運算符】【PHP可變變數】【PHP取址符號】【PHP分支與迴圈】【PHP流程式控制制語句goto】 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...