java 數組 反射_【譯】10. Java反射——數組

=====================================================================================

用Java反射來處理數組有時候是技巧性很強的。特別是如果你需要獲取一個給定類型的數組的Class對象,像int[ ]等。本文將講述怎么用Java反射來創建數組和獲取數組的Class對象。

下面是所涵蓋的主題列表:

java.lang.reflect.Array

Creating Arrays

Accessing Arrays

Obtaining the Class Object of an Array

Obtaining the Component Type of an Array

=====================================================================================

java.lang.reflect.Array

通過Java反射來處理數組需要用到java.lang.reflect.Array類。不要和Java集合中的java.util.Arrays類搞混淆了,它包含一些工具方法,像給數組排序、將數組轉換成集合等。=====================================================================================

CreatingArrays

通過Java反射來創建數組需要用到java.lang.reflect.Array類。下面的這個例子中會展示如何去創建一個數組:

int[] intArray = (int[]) Array.newInstance(int.class, 3);

這段代碼示例創建了一個int型的數組。Array.newInstance()方法的第一個參數int.class指定了數組中的每個元素應該是什么類型。第二個參數聲明了該數組應該為多少個元素開辟空間。

=====================================================================================

AccessingArrays

也可以通過Java反射來訪問數組中的元素。這是通過Array.get(…)和Array.set(…)方法做到的。下面是一個例子:

int[] intArray = (int[]) Array.newInstance(int.class, 3);

Array.set(intArray,0, 123);

Array.set(intArray,1, 456);

Array.set(intArray,2, 789);

System.out.println("intArray[0] = " + Array.get(intArray, 0));

System.out.println("intArray[1] = " + Array.get(intArray, 1));

System.out.println("intArray[2] = " + Array.get(intArray, 2));

這段代碼示例輸出如下:

intArray[0] = 123intArray[1] = 456intArray[2] = 789

=====================================================================================

Obtaining the Class Object of an Array

我在Butterfly DI Container項目中開發腳本語言時遇到一個問題,如何通過Java反射獲得數組的Class對象。不用反射你可以這樣做:

Class stringArrayClass = String[].class;

對數組用Class.forName()不是很直觀。例如,你可以像這樣訪問基本類型數組的Class對象:

Class intArray = Class.forName("[I");

JVM中用字母I代表int。在左邊加上[(左中括號)表示我比較感興趣的int數組的類。這對所有其他的基本類型同樣有效。

對于對象,你需要用一個稍微不同的符號:

Class stringArrayClass = Class.forName("[Ljava.lang.String;");

注意類名左邊的[L和右邊的分號(;)。這表示一個你指定類型的對象的數組。

附注,你不能用Class.forName()獲取基本類型的Class對象。下面的例子都會導致ClassNotFoundException:

Class intClass1 = Class.forName("I");

Class intClass2= Class.forName("int");

我通常像這樣做來獲取基本類型和對象的類型名:

publicClass getClass(String className){if("int" .equals(className)) return int .class;if("long".equals(className)) return long.class;

...returnClass.forName(className);

}

一旦你獲取了一種類型的Class對象,你也可以很簡單的獲取一個數組類型的Class對象。方案,或者你叫它變通措施,是先創建一個你期望的類型的空數組,然后從這個空數組獲取它的Class對象。這感覺有作弊的嫌疑,但是很有效。下面是它看起來的樣子:

Class theClass =getClass(theClassName);

Class stringArrayClass= Array.newInstance(theClass, 0).getClass();

這代表一個單一的、統一的訪問任何類類型的數組。沒有擺弄類名等。

為了確認該Class對象的確是一個數組,你可以調用Class.isArray()來檢查:

Class stringArrayClass = Array.newInstance(String.class, 0).getClass();

System.out.println("is array: " + stringArrayClass.isArray());

=====================================================================================

Obtaining the Component Type of an Array

一旦你獲取了數組的Class對象,你可以通過Class.getComponentType()方法訪問它的元素類型。元素類型是數組中元素的類型。例如,int[ ]數組的元素類型是int.class的Class對象。String[ ]數組的元素類型是java.lang.String的Class對象。

下面是一個訪問數組元素類型的例子:

String[] strings = new String[3];

Class stringArrayClass=strings.getClass();

Class stringArrayComponentType=stringArrayClass.getComponentType();

System.out.println(stringArrayComponentType);

這個例子將會輸出String數組的元素類型"java.lang.String"。

========================================================================================

目錄

這是一個本教程到目前為止涵蓋的主題列表:

(敬請期待下一篇翻譯)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529535.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

定時執行java程序_如何讓Java程序定時運行

由于項目開發的需要,必須實現讓一個Java程序定時運行。比如,我的項目中,有一個網絡蜘蛛,需要從互聯網上抓取數據,與其配合,有另一個程序來對新抓取的頁面進行索引的創建,由于數據源更新頻率不高…

java遞歸實現排序_快速排序算法原理及java遞歸實現

快速排序 對冒泡排序的一種改進,若初始記錄序列按關鍵字有序或基本有序,蛻化為冒泡排序。使用的是遞歸原理,在所有同數量級O(n longn) 的排序方法中,其平均性能最好。就平均時間而言,是目前被認為最好的一種內部排序方…

java 泛型 .net_Java泛型

標簽:上一篇博文java8函數式編程--收集器collector:(http://my.oschina.net/joshuashaw/blog/487322)講得比較隨性,并沒有把源碼一句一句拿出來分析,后來發現groupingBy方法最后有一個if-else分支用來返回不同類型的collector&…

卡法電子商務 java_javacard DES算法API使用示例

********** 2017年3月15日留言 ——關于java卡Applet系列csdn博文 *************貌似有不少人在看我寫的幾篇關于java卡applet的博文,也收到了一些評論指正博文錯誤,或者私信叫我發代碼文件過去。在此需要說明的是,java卡applet的這幾篇博文…

java http請求原理_淺談Spring Cloud zuul http請求轉發原理

spring cloud 網關,依賴于netflix 下的zuul 組件zuul 的流程是,自定義 了ZuulServletFilter和zuulServlet兩種方式,讓開發者可以去實現,并調用先來看下ZuulServletFilter的實現片段Overridepublic void doFilter(ServletRequest s…

java堆外內存溢出_JVM 案例 - 堆外內存導致的溢出錯誤

案例一個網站為了實現客戶端實時從服務端接收數據,使用了 CometD 1.1.1 作為服務端推送框架,服務器是 Jetty7.1.4,CPU i5,內存 4G,操作系統 32位Windows。服務端常常拋出內存溢出異常,管理員把堆開到最大(3…

java mail outlook_已啟用Outlook API郵件與郵箱用戶

一個非常微妙的問題,也許是特定的環境 . 我正在嘗試使用Outlook 2010 API從啟用郵件的用戶中識別郵箱用戶 . 我們在Notes to Exchange遷移期間使用Dell Quest遷移工具,它是一個流動的項目 . 仍處于原型階段,因此使用VB宏來最終將在C&#xff…

oracle java存儲過程返回值_java程序調用Oracle 存儲過程 獲取返回值(無返回,非結果集,結果集)...

java程序調用Oracle 存儲過程 獲取返回值(無返回,非結果集,結果集)oracle中procedure是不能有返回值的,要想返回值,就得有輸出參數,同樣要想返回記錄集,可以把游標類型作為輸出參數。下面是詳細情況說明&am…

mysql dump工具升級_MySQL數據庫升級

當前不少系統的數據庫依舊是MySQL5.6,由于MySQL5.7及MySQL8.0在性能及安全方面有著很大的提升,因此需要升級數據庫。本文通過邏輯方式、物理方式原地升級來介紹MySQL5.6 升級至MySQL5.7的方法,并介紹其使用場景。1. 邏輯方式升級邏輯方式升級…

java int 128 ==_為什么 Java Integer 中“128==128”為false,而”100==100“為true?

這是一個挺有意思的討論話題,讓我們用代碼說話吧!運行下面的代碼:Integer a 128, b 128;System.out.println(a b);Integer c 100, d 100;System.out.println(c d);你會得到:falsetrue基本知識:我們知道,如果兩個引用指向同一個對象&…

mysql課程表學時_Mysql 鞏固提升 (學生表_課程表_成績表_教師表)

方便Mysql 鞏固提升創建表并插入數據:-- ------------------------------ Table structure for student-- ----------------------------DROP TABLE IF EXISTS student;CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,sname varchar(32) DEFAULT NULL,s…

初始java_第一章__初始JAVA

1.java的三個發展方向:JAVASE(面向對象、API、JVM)、JAVAME(移動設備、游戲、通信)、JAVAEE(JSP、EJB、服務)2.開發JAVA的程序步驟:1.編寫源程序 2.編譯 3.運行3.JDKJRE開發工具下載java環境jdk 安裝并配置環境變量,.安裝直接下一步下一步直到…

python最常用的版本、也稱為classic_2021年中國大學《創新思維與創業》單元測試答案...

2021年中國大學《創新思維與創業》單元測試答案被人們稱為 “寒地水稻第一人”的是袁隆平答:錯地圖數據的基本特征包括答:時間屬性 空間定位屬性 地理屬性對賣方征稅導致商品價格上升答:√( )是在床榻上使用的一種矮形家具。答:炕…

java 泛型 繼承_java基礎之泛型的繼承

關于泛型的基本介紹和理解請參考以下幾篇文章&#xff0c;或查詢更多資料&#xff1a;本篇以簡單的List<>方式來進行說明。ArrayList繼承了List,ArrayList沒有繼承ListList>等價于List extends Object>請參考以下代碼&#xff1a;/*** author Ding Chengyun* 2014-…

appium java環境_Appium環境搭建(Windows版)

注&#xff1a;appium安裝到C盤&#xff0c;node.js安裝到C盤一、安裝node.js1、到官網下載node.js&#xff1a;https://nodejs.org/en/download/2、獲取到安裝文件后&#xff0c;直接雙擊安裝文件&#xff0c;根據程序的提示&#xff0c;完成nodejs的安裝。3、安裝完成后&…

ci mysql pdo_CI框架中pdo的使用方法

1、配置文件修改application/config文件夾下的database.php文件 $db[default] array(dsn > mysql:dbnameci_ecshop;host127.0.0.1,username > root,password > ,dbdriver > pdo,2、查詢操作$sql select * from aaa where id :id;$sql_array array(:id > …

ie11加載java插件_IE瀏覽器中ActiveX插件的使用

在某些行業的B/S應用系統中會不可避免的要用到ActiveX瀏覽器插件&#xff0c;而ActiveX插件只能在IE內核瀏覽器中運行&#xff0c;而常用的IE瀏覽器的版本眾多&#xff0c;從IE6到IE11&#xff0c;總共有6個版本&#xff0c;這就給開發的應用系統造成了不小的困擾&#xff1a;如…

netty java開發文檔_Netty簡明教學文檔

寫個簡單點&#xff0c;比較小白的文檔&#xff0c;言語比較接地氣Netty是什么&#xff1f;NIO的高層封裝&#xff0c;NIO很難寫&#xff0c;所以有了Netty&#xff0c;方便異步的操作service的主要代碼片段public void run() throws Exception {EventLoopGroup bossGroup new…

mysql 全局不重復_php uniqid() 通過MYSQL實現全局不重復的唯一ID

看了國外文章&#xff1a;https://jason.pureconcepts.net/2013/09/php-convert-uniqid-to-timestamp/ 不想寫&#xff50;&#xff48;&#xff50;腳本uniqid()處理&#xff0c;想到用mysql一次性把數據庫的ID改過來的方法&#xff0c;所以開始了以下研究方法一: 效率最高&…

java接口允許ajax訪問_服務允許AJAX請求,允許跨域請求

當工作時間&#xff0c;因為需要JS 進行AJAX請求&#xff0c;這時候存在跨域問題&#xff0c;當出現這種情況時&#xff0c;有多種方案解決比如使用JSONP&#xff0c;也有一種簡單的方式&#xff0c;就是在過濾器里面增加返回請求允許跨域head配置。代碼如下&#xff1a;/**** …