2014-12-02 21 views
3

代碼如何使用反射返回二維數組?

的目的要找出圖片就是在屏幕上通過與已經存在的像素集合,這是在返回二維數組方法的形式的比較,在DataStoragePics類。

如何我試圖解決它

  1. 使用反射我從存儲類DataStoragePicsmethodStorage[]所有方法。
  2. 然後我調用methodStorage[]的方法,然後將存儲在tempMatrix[][]
  3. 使用循環和另一種方法(此處未顯示)稍後我將使用它來找出捕獲的像素集合的類型。

我需要什麼

幫助。當我試圖通過使用中提到的步驟上面我坐上從重複兩次在主類中的倒數第三行的錯誤來解決這個問題:

Multiple markers at this line - Type mismatch: cannot convert from Object to int.

我認爲這個問題是methodStorage[x].invoke(DataStoragePicsObj)是一個數組,但它返回一個二維數組和程序不承認,所以它需要要麼tempMatrix是一個簡單的AR ray或methodStorage[]爲2D陣列。我需要幫助解決這個錯誤。

這是Main類:

import java.lang.reflect.Method; 

    int [][] tempMatrix = new int[16][450]; 

//Creates a DataStoragePics Object. 
    DataStoragePics DataStoragePicsObj = new DataStoragePics(); 
//Stores all DataStoragePics methods in methods[]. 
    Method[] methodStorage = DataStoragePicsObj.getClass().getMethods(); 

//Loops through methodStorage[]. 
    for(int x = 0; x < method.length; x++) 
    { 
     //Stores a 2D array from DataStoragePics class in tempMatrix. 
     //All methods in DataStoragePics return a 2D array with [16][10] dimensions. 

     /*This is the error line*/ 
     tempMatrix[16][10] = methodStorage[x].invoke(DataStoragePicsObj); 
     /*above is the error line*/ 
    } 

這是DataStoragePics類的部分:

public class DataStoragePics 
{ 

    public int[][] picXYZ() 
    { 
     int[][] rgbValues = 
     { 
     {1,2,3,4}, 
     {9,8,7,6} 
     }; 

     return rgbValues; 
    } 
} 

我是初學者位的時候纔來的Java /編碼等等請不要使用複雜的術語。

大綱的答案有幫助,但我仍然得到這個錯誤:「線程中的異常」main「java.lang.ClassCastException:java.lang.Class不能轉換爲[[I」事情是鑄造,它存儲和返回屏幕上的東西。有時它會在最後顯示錯誤。不知道爲什麼。

+1

什麼是'tempMatrix'的類型?你沒有向我們展示你是如何創造這個的。 – csmckelvey 2014-12-02 14:06:47

+0

補充說明 – user3144079 2014-12-02 14:08:47

回答

1

您通過所有循環在你的類中的方法分配給INT [] []對象(全tempMatrix?)。並將這些方法中的每一個的返回值轉換爲int[][]

Method[] methodStorage = DataStoragePicsObj.getClass().getMethods(); 

//Loops through methodStorage[]. 
    for(int x = 0; x < method.length; x++) 

這當然是要失敗的,因爲你的DataStoragePicsObj類隱式擴展java.lang.Object其中有像hashCodetoStringgetClass方法不返回int[][]

如果你通過反射調用一個方法,你應該準備好傳遞它的正確參數和它的返回值的過程;如果你不能,你不應該通過反思來調用該方法。

你可以做什麼 - 如果我對你想要做的理解是正確的 - 是檢查返回類型,也是爭論,以確保您準備處理反射調用:

Method m = methodStorage[x]; 
    if (m.getReturnType() != int[][].class || m.getParameterTypes().length != 0) { 
     // Skip this method because it requires arguments or doesn't return int[][] 
     continue; 
    } 
+0

DataStoragePics類的所有方法返回int [] []沒有任何其他返回類型的方法沒有void方法,沒有int方法,沒有double,沒有字符,沒有字符串,沒有float,沒有int [],沒有這些類型只是int [] []。 – user3144079 2014-12-06 04:01:19

+0

@ user3144079請再次閱讀我的答案。 'DataStoragePicsObj'從'java.lang.Object'繼承了方法(就像任何Java類一樣,你不能壓制這個)爲什麼你不試試我的解決方案並檢查它是否工作? – 2014-12-06 05:48:08

+0

@ user3144079如果添加語句System.out.println(methodStorage [x] .getName()),您將發現導致異常的方法稱爲'getClass'。 – 2014-12-06 06:32:34

1

實際上,沒有「cast」,編譯器只是認爲invoke返回一個Object

tempMatrix[16][10]表示您的tempMatrix陣列中的元素(16,10),因此其類型爲int

因此,將對象分配給int會引發編譯器錯誤:在「=」之後的類型必須是「相同的」。

首先,您必須將由調用返回的對象轉換爲int[][]。 然後,你必須

tempMatrix = (int[][]) methodStorage[x].invoke(DataStoragePicsObj); 
+0

謝謝你的幫助,但它需要例外。 – user3144079 2014-12-03 05:54:44