java反射(tutorial翻譯)Part3

課程:數組

Array類提供了一種方法,這種方法允許你動態創建和訪問數組。這一節課你將要學到如何使用這些方法。

指定數組

這一節向您展示如何處理當對象是一個數組的時候。

如果你不確定一個特定的對象是一個數組,你可以通過Class.isArray方法麳檢查以下。嚷我們麳看一個例子。

這個示例程序打印數組的名字,這個數組被封裝成一個對象。這個程序執行以下幾步:

1.  它返回Class對象。

2.  獲得Field對象。

3.  對每一個Field對象,程序獲得相應的Class對象通過調用getType方法。

4.  驗證前面步驟返回的Class對象是數組,這個程序調用isArray方法。

以下是源代碼:

import java.lang.reflect.*; 
     
import java.awt.*; 
     

  
     
       
    
class SampleArray { 
     

  
     
       
    
   public static void main(String[] args) { 
     
      KeyPad target = new KeyPad(); 
     
      printArrayNames(target); 
     
   } 
     

  
     
       
    
   static void printArrayNames(Object target) { 
     
      Class targetClass = target.getClass(); 
     
      Field[] publicFields = targetClass.getFields(); 
     
      for (int i = 0; i < publicFields.length; i++) { 
     
         String fieldName = publicFields[i].getName(); 
     
         Class typeClass = publicFields[i].getType(); 
     
         String fieldType = typeClass.getName(); 
     
         if (typeClass.isArray()) { 
     
            System.out.println("Name: " + fieldName + 
     
               ", Type: " + fieldType); 
     
         } 
     
      } 
     
   } 
     
} 
     

  
     
       
    
class KeyPad { 
     

  
     
       
    
   public boolean alive; 
     
   public Button power; 
     
   public Button[] letters; 
     
   public int[] codes; 
     
   public TextField[] rows; 
     
   public boolean[] states; 
     
} 
     

輸出如下:

Name: letters, Type: [Ljava.awt.Button; 
     
Name: codes, Type: [I 
     
Name: rows, Type: [Ljava.awt.TextField; 
     
Name: states, Type: [Z 
     

返回組件類型

如果你想發現數組的類型,你將要從這一節的示例中學到。

組件類型是數組元素的類型。例如,arrowKeys數組的組件類型在以下代碼中是Button類型:

Button[] arrowKeys = new Button[4]; 
     

通過調用getComponentType方法返回數組元素的組件類型。

示例程序調用getComponentType方法幷且打印出數組中每一個元素的類名。

import java.lang.reflect.*; 
     
import java.awt.*; 
     

  
     
       
    
class SampleComponent { 
     

  
     
       
    
   public static void main(String[] args) { 
     
      int[] ints = new int[2]; 
     
      Button[]  buttons = new Button[6]; 
     
      String[][] twoDim = new String[4][5]; 
     

  
     
       
    
      printComponentType(ints); 
     
      printComponentType(buttons); 
     
      printComponentType(twoDim); 
     
   } 
     

  
     
       
    
   static void printComponentType(Object array) { 
     
      Class arrayClass = array.getClass(); 
     
      String arrayName = arrayClass.getName(); 
     
      Class componentClass = arrayClass.getComponentType(); 
     
      String componentName = componentClass.getName(); 
     
      System.out.println("Array: " + arrayName + 
     
         ", Component: " + componentName); 
     
   } 
     
} 
     

輸出:

Array: [I, Component: int 
     
Array: [Ljava.awt.Button;, Component: java.awt.Button 
     
Array: [[Ljava.lang.String;, Component: [Ljava.lang.String; 
     

創建數組

這一節將要向您展示在運行時創建數組是多麽的簡單。

如果你正在編寫一個例如應用程序構建器的開發工具,你可能想要允許用戶在運行時創建數組。你的程序可以通過Array.newInstance方法提供這個特性。

以下示例程序使用newInstance方法麳創建一個數組的拷貝,這個數組大小是原來數組的兩倍。newInstance方法接受新數組的長度和組件類型。以下是源代碼:

import java.lang.reflect.*; 
     

  
     
       
    
class SampleCreateArray { 
     

  
     
       
    
   public static void main(String[] args) { 
     
      int[] originalArray =  {55, 66}; 
     
      int[] biggerArray = (int[]) doubleArray(originalArray); 
     
      System.out.println("originalArray:"); 
     
      for (int k = 0; k < Array.getLength(originalArray); k++) 
     
         System.out.println(originalArray[k]); 
     
      System.out.println("biggerArray:"); 
     
      for (int k = 0; k < Array.getLength(biggerArray); k++) 
     
         System.out.println(biggerArray[k]); 
     
   } 
     

  
     
       
    
   static Object doubleArray(Object source) { 
     
      int sourceLength = Array.getLength(source); 
     
      Class arrayClass = source.getClass(); 
     
      Class componentClass = arrayClass.getComponentType(); 
     
      Object result = Array.newInstance(componentClass, 
     
                                        sourceLength * 2);      
     
      System.arraycopy(source, 0, result, 0, sourceLength); 
     
      return result; 
     
   } 
     
} 
     

輸出:

originalArray: 
     
55 
     
66 
     
biggerArray: 
     
55 
     
66 
     
0 
     
0 
     

你也可以使用newInstance方法麳創建多維數組。在這個情况下,方法的參數是新數組維數的組件類型和int類型的數組。

以下程序展示如何使用newInstance麳創建多維數組:

import java.lang.reflect.*; 
     

  
     
       
    
class SampleMultiArray { 
     

  
     
       
    
   public static void main(String[] args) { 
     

  
     
       
    
      // The oneDimA and oneDimB objects are one 
     
      // dimensional int arrays with 5 elements. 
     

  
     
       
    
      int[] dim1 = {5}; 
     
      int[] oneDimA = (int[]) Array.newInstance(int.class, dim1); 
     
      int[] oneDimB = (int[]) Array.newInstance(int.class, 5); 
     

  
     
       
    
      // The twoDimStr object is a 5 X 10 array of String objects. 
     

  
     
       
    
      int[] dimStr = {5, 10}; 
     
      String[][] twoDimStr = 
     
                 (String[][]) Array.newInstance(String.class,dimStr); 
     

  
     
       
    
      // The twoDimA object is an array of 12 int arrays. The tail 
     
      // dimension is not defined. It is equivalent to the array 
     
      // created as follows: 
     
      //    int[][] ints = new int[12][]; 
     

  
     
       
    
      int[] dimA = {12}; 
     
      int[][] twoDimA = (int[][]) Array.newInstance(int[].class, dimA); 
     
   } 
     
} 
     

獲得和設置元素的值

即使你直到運行時才直到數組名字,你也可以檢查或者修改它元素的值。這一節將要告訴你如何來做。

在許多程序中,訪問數組元素你只是通過賦值表達式麳做:

int[10] codes; 
codes[3] = 22; 
aValue = codes[3];

如果你在運行時才直到數組的名稱的時候這種方式是不可行的。

幸運的是,你可以使用Array類的setget方法麳訪問數組元素,當在編譯時刻不知道數組名的時候。除了getset方法,Array類對于原始類型有特定的方法。例如,setInt的參數值是一個intgetBoolean返回的對象是一個boolean類型的包裝類。

示例程序使用setget方法麳拷貝一個數組的內容到另一個數組。

import java.lang.reflect.*; 
     

  
     
       
    
class SampleGetArray { 
     

  
     
       
    
   public static void main(String[] args) { 
     
      int[] sourceInts = {12, 78}; 
     
      int[] destInts = new int[2]; 
     
      copyArray(sourceInts, destInts); 
     
      String[] sourceStrgs = {"Hello ", "there ", "everybody"}; 
     
      String[] destStrgs = new String[3]; 
     
      copyArray(sourceStrgs, destStrgs); 
     
   } 
     

  
     
       
    
   public static void copyArray(Object source, Object dest) { 
     
      for (int i = 0; i < Array.getLength(source); i++) { 
     
         Array.set(dest, i, Array.get(source, i)); 
     
         System.out.println(Array.get(dest, i)); 
     
      } 
     
   } 
     
} 
     

輸出:

12 
     
78 
     
Hello 
     
there 
     
everybody 
     

你可能感兴趣的:(java反射)