如何使用Reflection返回2D数组?

时间:2014-12-02 14:02:39

标签: java arrays

代码的目的

通过在DataStoragePics类中将现有的一组像素(以返回二维数组的方法的形式)与之比较,找出屏幕上的图片。

我是如何解决的

  1. 使用反射我在DataStoragePics。{/ li>中存储了methodStorage[]类中的所有方法
  2. 然后我从methodStorage[]调用一个方法,然后将其存储在tempMatrix[][]中。
  3. 使用循环和另一种方法(此处未显示)我稍后会用来找出捕获的像素集是什么类型的图片。
  4. 我需要帮助

    当我尝试使用上面提到的步骤解决问题时,我在主类的底部第三行出现错误,重复两次:

      

    此行有多个标记 - 类型不匹配:无法从Object转换为int。

    我认为问题是methodStorage[x].invoke(DataStoragePicsObj)是一个单独的数组,但它返回一个二维数组,程序无法识别,所以它需要tempMatrix是一个简单的数组或者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 /编码我是初学者所以请不要使用复杂的术语。

    教学大纲的答案有所帮助,但我仍然收到这个错误:&#34;线程中的异常&#34; main&#34; java.lang.ClassCastException:java.lang.Class不能转换为[[I&#34;事情是铸造,它存储并返回屏幕上的东西。有时它有时会在中间显示错误。不知道为什么。

2 个答案:

答案 0 :(得分:1)

实际上,没有“强制转换”,编译器只会认为invoke返回Object

tempMatrix[16][10]表示tempMatrix数组中的元素(16,10),因此其类型为int

因此,将一个Object分配给一个int会引发编译器错误:在“=”之后的类型必须是“相同”。

首先,您必须将通过调用返回的Object强制转换为int[][]。 那么你必须分配一个int [] []对象(完整的tempMatrix?)

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

答案 1 :(得分:1)

您正在循环遍历班级中的所有方法。并将每个方法的返回值转换为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;
    }