1. 程式人生 > >java反射之陣列反射

java反射之陣列反射

1、陣列反射的特點

1)具有相同維數和元素型別的陣列屬於同一個型別,即具有相同的Class例項物件

2)代表陣列的Class例項物件的getSuperClass()方法返回的父類為Object類對應的Class

3)基本型別的一維陣列可以被當做Object型別使用,不能當做Object[]型別使用,非基 本型別的一維陣列,既可以當做Object型別使用,又可以當做Object[]型別使用

例一:證明具有相同維數和元素型別的陣列屬於同一個型別,即具有相同的Class例項物件

@Test

publicvoid test1(){

int[]arr1=newint[2];//建立一個大小為2的整數型陣列

int[]arr2=newint[5];//建立一個大小為5的整數型陣列

String[]arr3=new String[2];//建立一個大小為2的String陣列

int[][]arr4=newint[2][3];//建立一個二維陣列

//判斷維數相同且資料型別相同的陣列是否屬於同一個Class

System.out.println(arr1.getClass()== arr2.getClass());

}

執行結果:true

如果讓arr1arr3向比較如下:

System.out.println(arr1.getClass()== ar3.getClass());

  此時編譯不通過,會出現

TicketDemo.java:11: 不可比較的型別:java.lang.Class<capture#824 of ? extends int

[]> 和 java.lang.Class<capture#995 of ? extends java.lang.String[]>

                System.out.println(arr1.getClass()== arr3.getClass());

                                                  ^                                           

  如果讓arr1arr4向比較如下:

System.out.println(arr1.getClass()== ar4.getClass());

此時編譯不通過,會出現

不可比較的型別:java.lang.Class<capture#283 of ? exten

[]> 和 java.lang.Class<capture#456 of ? extends int[][]>

                System.out.println(arr1.getClass()== arr3.getClass());

                                                  ^

  所以從上面三個案例中可以證明維數和元素型別的陣列只用同時相同時,才屬於同一個型別,即具有相同的Class例項物件,有一個不相同,就不是同一個型別。

例二:證明代表陣列的Class例項物件的getSuperClass()方法返回的父類為Object類對應的Class

@Test

publicvoid test2(){

int[]arr1=newint[2];//建立一個大小為2的整數型陣列

int[]arr2=newint[5];//建立一個大小為5的整數型陣列

String[]arr3=new String[2];//建立一個大小為2的String陣列

int[][]arr4=newint[2][3];//建立一個二維陣列

System.out.println(arr1.getClass().getSuperclass().getName());System.out.println(arr3.getClass().getSuperclass().getName());

}

執行結果入下:

java.lang.Object

java.lang.Object

例三:基本型別的一維陣列可以被當做Object型別使用,不能當做Object[]型別使用,非基 本型別的一維陣列,既可以當做Object型別使用,又可以當做Object型別使用

1)基本型別

@Test

publicvoid test3(){

int[]arr1=newint[]{1,3};//建立一個大小為2的整數型陣列

String[]arr3=new String[]{"黑馬_1","黑馬_2"};//建立一個大小為2的String陣列

Object intObj=arr1;//把陣列arr1賦值給Object

System.out.println(intObj);

}

執行結果:[[email protected]

如果有下面的程式碼:

Object[] intObjs=arr1;//把陣列arr1賦值給Object

上面的程式碼編譯不能通過:cannotconvert from int[] to Object[]

  從上面的案例可以看出基本資料型別可以被當做Object型別使用,但是不能當做Object型別使用

(2)非基本型別

@Test

publicvoid test4(){

String[]arr3=new String[]{"黑馬_1","黑馬_2"};//建立一個大小為2的String陣列

Object stringObj=arr3;//把陣列arr1賦值給Object

Object[] stringObjs=arr3;//把陣列arr1賦值給Objectcannot

Object stringObje=arr3;//把陣列arr3賦值給Object

System.out.println(stringObj);

System.out.println(stringObjs);

}

執行結果:[Ljava.lang.String;@9ced8e

[Ljava.lang.String;@9ced8e

  從上面可以看出,如果不是基本資料型別的話,既可以當做Object型別使用,又可以當做Object型別使用

2Arrays.asList()方法處理int[]String[]時的差異

@Test

publicvoid test5(){

int[]arr1=newint[]{1,3};//建立一個大小為2的整數型陣列

String[]arr3=new String[]{"黑馬_1","黑馬_2"};//建立一個大小為2的String陣列

System.out.println(Arrays.asList(arr1));//把整型陣列轉化成List集合

System.out.println(Arrays.asList(arr3));//把String陣列轉化成List集合

}

執行結果如下:[[[email protected]]

[黑馬_1, 黑馬_2]

  為什麼整型陣列轉化成List集合後列印的結果是[[[email protected]],而不是[1,3]呢?而對於String則可以輸出想要的結果呢?

我們知道在JDK1.4之前後Arrays中的asList(Object[]obj),JDK1.5Arrays中的asList(T...a),接收的可變引數,當傳入引數時,為了相容性,它首先看JDK1.4是否可以執行,例如,對於整型,他首先傳入,而JDK1.4之前是接收的Object型別的,所以用JKD1.5的運行了,對於整型,它把整個整型陣列當做一個物件了。而String型別的就可以傳入JDK1.4.符合Object

3、對陣列進行反射

  Java中有一個類ArrayArray 類提供了動態建立和訪問 Java 陣列的方法

public static  get( array,int index)

返回指定陣列物件中索引元件的值

其中:array- 陣列

index- 索引

public static void set( array,int index, value)

將指定陣列物件中索引元件的值設定為指定的新值

其中:

array- 陣列

index- 陣列內部的索引

value- 索引元件的新值

例如:

@Test

publicvoid test6(){

int[]arr1=newint[]{1,3};//建立一個大小為2的整數型陣列

String[]arr3=new String[]{"黑馬_1","黑馬_2"};//建立一個大小為2的String陣列

//如果傳入的是陣列

print(arr3);

//如果是字串

print("aaa");

}

publicvoid print(Object obj){

//獲取Object的Class物件

Class cl=obj.getClass();

if(cl.isArray()){//判斷是否為陣列,如果是陣列,遍歷

for(int i=0;i<Array.getLength(obj);i++){

System.out.println(Array.get(obj, i));

}

}else{//如果不是陣列,直接列印

System.out.println(obj);

}

}

執行結果:黑馬_1

黑馬_2

          aaa

上面的知識點更好的解釋了在反射main方法時,為什麼傳進一個數組,他會拆分的問題了

相關推薦

java反射陣列反射

1、陣列反射的特點 (1)具有相同維數和元素型別的陣列屬於同一個型別,即具有相同的Class例項物件 (2)代表陣列的Class例項物件的getSuperClass()方法返回的父類為Objec

java -- 反射利用反射完善工廠設計模式

java的工廠設計模式源自於生活,大家先看一個例子,比較簡單,我剛開始瞭解工廠時看到的簡單例子。 interface IFruit { public void eat(); } class Apple implements IFruit { @Override pub

Java基礎課程-陣列-反射機制

1.上章回顧與預習檢查 1.1 上章回顧 介面與抽象類的區別? 什麼是內部類? 談談你對回撥函式的理解? 1.2 預習檢查 什麼是陣列? 陣列中是length屬性還是length()方法? 陣列的下標從幾開始? 什麼是反射? 2.

Go語言反射反射

文章目錄 1 概述 2 值反射物件 3 修改值 4 修改結構體欄位值 1 概述 反射不僅可以獲取值的型別資訊,還可操作變數的值。使用 reflect.Value 型別操作變數的值。 2 值反射

Go語言反射型別反射

文章目錄 1 概述 2 獲取型別 3 獲取基礎型別(類別) 4 指標引用的元素型別 5 結構體資訊 6 結構體標籤 1 概述 類似於 Java,Go 語言也支援反射。支援反射的語言可以在

Java系列陣列

原文首發於微信公眾號:jzman-blog,歡迎關注交流! 本來打算溫習一下註解方面的內容作為今天的推送,但是來不及寫了,那就一起來看一下陣列,陣列是用來存放一組具有相同型別資料的資料結構,通過下標來訪問陣列中的元素。 陣列的定義 陣列的定義主要有兩種,一種是先

java學習陣列

1 陣列的定義 在Java中,可以使用以下格式來定義一個數組。如下 資料型別[] 陣列名 = new 資料型別[元素個數或陣列長度]; int[] x = new int[100]; 上述語句就相當於在記憶體中定義了100個int型別的變數,第一個變數的名稱為x[0],第二個變數的名稱為x[1],以此

java學習 陣列排序-選擇排序

package Day004; public class arrayDemo { public static void main(String [] args) { System.out.println("跟陣列有關的demo"); int [] arrs =

java基礎陣列

public static void main(String[] args) { int[] arr = new int[]{34, 23, 56, 21, 19,68,10}; System.out.print("反轉前:"); for (

反射暴力反射

AccessibleObject 類是 Field、Method 和 Constructor 物件的基類。它提供了將反射的物件標記為在使用時取消預設 Java 語言訪問控制檢查的能力。對於公共成員、預設(打包)訪問成員、受保護成員和私有成員,在分別使用 Field、Method 或 Constructor

Java基礎 陣列詳解

前言:Java內功心法之陣列詳解,看完這篇你向Java大神的路上又邁出了一步(有什麼問題或者需要資料可以聯絡我的扣扣:734999078)    陣列概念 同一種類型資料的集合。其實陣列就是一個容器。 陣列的好處 可以自動給陣列中的元素從0開始編號,方便操作這些元素。 格式1:

Java JSON 陣列 轉 JSON 字串

下載依賴 jar 包 json.jar package com.json8; import org.json.JSONArray; import org.json.JSONException; public class Test { public stat

Java程式設計陣列逆序輸出

工具:IntelliJ IDEA 15.0.5  程式碼很簡單,上程式碼 /* 題目:將一個數組逆序輸出。 1.程式分析:用第一個與最後一個交換。 */ import java.util.Sc

Java基礎】RTTI與反射Java

start auth try dword star sse from tac sed 1 ; Example assembly language program -- 2 ; Author: Karllen 3 ; Date: revised 05/2014

Java基礎反射

實例 編譯 ring 反序列化 ons 信息 method api 反射 Java反射是指運行時獲取類信息,進而在運行時動態構造對象、調用對象方法及修改對象屬性的機制。百度百科的定義:“JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和

Java反射調用內部類

pre http code 引用 IE out col sin over 1. 反射調用默認訪問權限的內部類 package com.blueStarWei.invoke; import java.lang.reflect.Method; import com.blu

Java反射基礎概念

ide 包名 void java 類名 super 運行 生成 over 0.實例準備 package com.blueStarWei.invoke; public class Student { private String name; pu

Java 基礎詳解 Java 反射機制

一行代碼 strac classname for 內部 系統資源 用戶 管理 ann 一、什麽是 Java 的反射機制? ??反射(Reflection)是Java的高級特性之一,是框架實現的基礎,定義:JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有

Java語法反射

數組 私有 declare put 需要 out div inter oca 一、反射機制 在前面Java語法之註解自定義註解時我們也有提到反射,要獲取類方法和字段的註解信息,必須通過Java的反射技術來獲取 Annotation對象。那什麽是反射呢?JAVA反射機制是在運

java反射動態代理學習筆記

ace ins 功能 運行 invoke -- ram lang glib 動態代理概述:代理:本來自己做的事情,請別人來做,被請的人就是代理對象;舉例:春節回家買票讓人代理買動態代理:在程序運行過程中產生的這個對象,而程序運行過程中產生對象其實就是我們剛才反射講解的內容,