1. 程式人生 > >java中的反射三(反射機制深入---對陣列的操作)

java中的反射三(反射機制深入---對陣列的操作)

反射機制對陣列的操作1

取得陣列的Class物件以及相關屬性和方法

public class ClassArrayDemo{
	public static void main(String args[]) throws Exception{
		int temp[] = {1,2,3} ;// 宣告一整型陣列
		Class<?> c = temp.getClass().getComponentType() ;	// 取得陣列的Class物件
		System.out.println("型別:" + c.getName()) ;	// 取得陣列型別名稱
		System.out.println("長度:" + Array.getLength(temp)) ;
		System.out.println("第一個內容:" + Array.get(temp,0)) ;
		Array.set(temp,0,6) ;
		System.out.println("第一個內容:" + Array.get(temp,0)) ;
	}
};

對陣列的開闢和拷貝

public class ChangeArrayDemo{
 public static void main(String args[]) throws Exception{
  int temp[] = {1,2,3} ;// 宣告一整型陣列
  int newTemp[] = (int []) arrayInc(temp,5) ; // 重新開闢空間5
  print(newTemp) ;
  System.out.println("\n-------------------------") ;
  String t[] = {"lxh","mldn","mldnjava"} ;
  String nt[] = (String [])arrayInc(t,8) ;
  print(nt) ;
 }
 public static Object arrayInc(Object obj,int len){
  Class<?> c = obj.getClass() ;
  Class<?> arr = c.getComponentType() ; // 得到陣列的
  Object newO = Array.newInstance(arr,len) ; // 開闢新的大小
  int co = Array.getLength(obj) ;
  System.arraycopy(obj,0,newO,0,co) ; // 拷貝內容
  return newO ;
 }
 public static void print(Object obj){ // 陣列輸出
  Class<?> c = obj.getClass() ;
  if(!c.isArray()){ // 判斷是否是陣列
   return;
  }
  Class<?> arr = c.getComponentType() ;
  System.out.println(arr.getName()+"陣列的長度是:" + Array.getLength(obj)) ;  // 輸出陣列資訊
  for(int i=0;i<Array.getLength(obj);i++){
   System.out.print(Array.get(obj,i) + "、") ; // 通過Array輸出
  }
 }
};

反射機制對陣列的操作2

public class RefletTest {

	/**
	 * 陣列的的反射
	 */
	public static void main(String[] args) {
		String[] obj=new String[]{"a","b","c"};
		printArrays(obj);
		printArrays("xyz");
		
		
	}

	private static void printArrays(Object obj) {
		  Class cazz=obj.getClass();
		  
		  if(cazz.isArray())
		  {
			  int len=Array.getLength(obj);
			    for(int i=0;i<len;i++)
			    {
			    	  System.out.println(Array.get(obj,i));
			    }
		  }
		  else
		  {
			   System.out.println(obj);
		  }
		  
		
	}

}


用反射方式執行某個類中的main方法

public class ReflectTest {
	public static void main(String[] args) throws Exception {
		  String startingClassName=args[0];
		  Method  mainMethod=Class.forName(startingClassName).getMethod("main",String[].class);
		  
		  //這一點特別注意:這裡使用new Object[]陣列將new String[] 進行打包成一個物件
		  mainMethod.invoke(null,new Object[]{new String[]{"111","222","333"}});
		
	}	
}
class TestArguments {
	
	  public static void main(String[] args)
	  {
		  for(String s:args)
		    System.out.println(s);
	  }
}

陣列型別與Object型別之間的關係

public class ArrayReflectTest {

	/**
	 * 陣列的反射
	 * 1--具有相同維數和元素型別的屬於屬於同一個型別。及具有相同的Class例項物件。
	 * 2--代表陣列的Class例項物件的getSuperClass()方法返回的父類為Object類對應的Class。
	 * 3--基本型別的一維陣列可以被當作Object型別使用,不能當做Object[]型別使用;
	 * 非基本型別的一維陣列,即可以當做Object[]型別使用,又可以當做Object[]型別使用。
	 * 
	 */
	public static void main(String[] args) {
		int[]     a1=new int[]{1,2,3};
		int[]     a2=new int[4];
		int[][]   a3=new int[2][3];
        String[]  a4=new String[]{"a","b","c"};
        
        System.out.println(a1.getClass()==a2.getClass()); //返回true因為符合(具有相同維數和元素型別的屬於屬於同一個型別。及具有相同的Class例項物件。);
        
        System.out.println(a1.getClass()==a3.getClass());//返回false,因為a1陣列的型別是基本資料型別的陣列,其型別屬於Object型別,而a3是引用型別的陣列,其型別屬於Object[]型別。即型別不同和維數也不同
        
        System.out.println(a1.getClass()==a4.getClass());//返回false因為a1陣列的型別是基本資料型別的陣列,而a4是引用型別的陣列。即型別不同
        
        Object  obj1=a1;
        Object  obj2=a2;
        Object[]  obj3=a3;
        Object[]  obj4=a4;
        
        System.out.println(obj1+"\n"+obj2+"\n"+obj3+"\n"+obj4+"\n");
        System.out.println(Arrays.asList(obj1));//基本型別的一維陣列可以被當作Object型別使用,不能當做Object[]型別使用
        System.out.println(Arrays.asList(obj3));//非基本型別的一維陣列,即可以當做Object[]型別使用,又可以當做Object[]型別使用。
        System.out.println(Arrays.asList(obj4));//非基本型別的一維陣列,即可以當做Object[]型別使用,又可以當做Object[]型別使用。
        
	}

}

相關推薦

java反射(反射機制深入---陣列操作)

反射機制對陣列的操作1 取得陣列的Class物件以及相關屬性和方法 public class ClassArrayDemo{ public static void main(String args[]) throws Exception{ int temp[] = {

Java學習筆記】66:認識Java的Reflection(反射)機制,獲取類的屬性和方法

反射部分一直欠著,現在學框架和Servlet必須要學一下了。最近學習Struts2框架和Servlet時候,很多地方直接給出類名就可以去使用了,如在web.xml中配置Filter時: <filter> <filter-name&

深入理解Java的回撥機制(最通俗易懂的回撥機制的部落格)

1. 什麼是回撥? 在我看來,回撥其實是一個相當具有迷惑性的名字,因為它很容易讓人糾結於回撥這個詞語本身的含義,從而忽略了回撥這種機制的本質。要理解Java中的回撥概念,最好的方式不是通過例項,而是從回撥概念的起源說起。   最開始接觸回撥時在C語言中函式指

夯實Java基礎系列11:深入理解Java的回撥機制

目錄 模組間的呼叫 多執行緒中的“回撥” Java回撥機制實戰 例項一 : 同步呼叫 例項二:由淺入深 例項三:Tom做題 參考文章

java存在垃圾回收機制,但是還會有內存泄漏的問題,原因是

java 自己 data .so 這樣的 即使 垃圾 ref stack 答案是肯定的,但不能拿這一句回答面試官的問題。分析:JAVA是支持垃圾回收機制的,在這樣的一個背景下,內存泄露又被稱為“無意識的對象保持”。如果一個對象引用被無意識地保留下來,那麽垃圾回收器不僅不會處

javaRandomAccessFile類的作用:指定文件可以進行讀寫的操作

cnblogs 讀寫 acc com ces 作用 分享 進行 .com 在java中RandomAccessFile類的作用:對指定文件可以進行讀寫的操作

Java目運算符

java 簡單 tro div 組成 分支 p s center 結構 Java中的三目運算符 Java中的三目運算符: 有些選擇分支結構,可以使用簡單的條件運算符來代替. 如: if(a<b) min=a; else min=b; //可以用下面

你真的會用java目運算符嗎

tmp nbu mar bce dft class eth 黃金 fzu 我也慨嘆不已,想我當初15級裝備王者黃金弓時攻擊力才達到180,現在要是到了15級再裝備的話,攻擊力就遠遠不是那麽低了! 一陣動亂之後,大約十幾個水晶螃蟹的仇恨立刻全部被吸引了過去,我立刻眼疾手快的換

Java - Java 種 ClassLoader

虛擬 .class nbsp 無法 path ssp ots c++編譯 pcl 1、虛擬機類加載器(稱為“bootstrap class loader”),它本身沒有父類加載器,它負責加載虛擬機的內置類,由於它是用C、C++寫的,所以Java無法拿到其class文件,返回

java目運算

ava 基礎 system ring args 復習 value println 代碼 直接上代碼!復習基礎! public static void main(String args[]){ int a , b; a = 10;

Java的異常處理機制

條件 order 什麽是 浪費 sun color 越界 details 區域 基本框架如下Java中的異常處理機制只要實現自Throwable接口,繼承關系如下: 如上圖可以看出這個機制的處理對象主要分為兩種:主要區別error 表示恢復不是不可能但很困難的情況下的

java的引用類型的象存放在哪裏

void 上下 實例變量 java body 在哪裏 運行時 () 數據 根據上下文來確定。比如void func(){ Object obj = new Object();//這個obj在函數的棧裏。}class Test{ private Object obj

Java目運算符可能出現的問題

-m add 運算符 inline test orm JD borde lean 你真的了解Java中的三目運算符嗎? 原創 2018-04-27 刨根問底的 Hollis Hollis Hollis 微信號 hollischuang 功能介紹 一個對Coding有

Java的類繼承機制、接口

string類型 賦值 In void ati ble public 3.1 eache 1)聲明一個Person類,有name(String類型)、age(int類型)、sex(char類型)屬性,通過構造方法進行賦值。一個show方法,返回String類型,內容如下:

詳解 Java 種代理模式

繼承 jvm 保存 3.2 指令集 throwable eth args 代理類 代理模式 代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;即通過代理對象訪問目標對象.這樣做的好處是:可以在目標對象實現的基礎上,增強額外的功能操作,即擴展目標

009-java常用的單個鍵值

RKE tab string class lan integer eva guava 鍵值對 1、Java 6提供AbstractMap.SimpleEntry<K,V>和AbstractMap.SimpleImmutableEntry<K,V>

java輸入個字元後,按各字元的ASCII碼從小到大的順序輸出這個字元。

import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanne

Java atomic 類底層機制、協程

1、Java 中atomic 類底層機制 atomic類:AtomicInteger 等,其底層使用CAS機制,CAS 的底層實現時unsafe的compareAndSwapInt(this,valueOffset, expect, update)方法,其保證V , A, B 的原子性;CAS

java的垃圾處理機制

目錄 一、出現的問題 二、解決的方法。 三、普通物件的垃圾回收機制是如何工作的? 1. 判斷哪些物件是垃圾 1.1 引用計數演算法 1.2 可達性分析演算法 2. JVM堆模型/分代 3. 垃圾收集演算法 3.1 標記-清除演算法 3.2 複製演算法

java的類載入機制

今天看了許多大牛的解釋,現在來做個總結: 類的載入機制過程是指由jvm的類載入器載入class位元組碼檔案進入記憶體的過程;(暫且這樣理解) 類載入器可以分為引導類載入器,擴充套件類載入器,系統類載入器;有些地方又可以這樣分:啟動類載入器,自定義載入器。 類載入機制過程: