Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用反射返回二维数组?_Java_Arrays - Fatal编程技术网

Java 如何使用反射返回二维数组?

Java 如何使用反射返回二维数组?,java,arrays,Java,Arrays,代码的目的 在DataStoragePics类中,通过将屏幕上的图片与已存在的一组像素(以返回2D数组的方法的形式)进行比较,找出屏幕上的图片 我是如何试图解决它的 使用反射,我将DataStoragePics类中的所有方法存储在methodStorage[]中 然后我从methodStorage[]调用一个方法,该方法随后将存储在tempMatrix[][]中 使用循环和另一种方法(此处未显示),我稍后将使用它来找出捕获的像素集是什么类型的图片 我需要什么帮助 当我尝试使用上述步骤解决问题时,

代码的目的

DataStoragePics
类中,通过将屏幕上的图片与已存在的一组像素(以返回2D数组的方法的形式)进行比较,找出屏幕上的图片

我是如何试图解决它的

  • 使用反射,我将
    DataStoragePics
    类中的所有方法存储在
    methodStorage[]
  • 然后我从
    methodStorage[]
    调用一个方法,该方法随后将存储在
    tempMatrix[][]
  • 使用循环和另一种方法(此处未显示),我稍后将使用它来找出捕获的像素集是什么类型的图片
  • 我需要什么帮助

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

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

    我认为问题在于
    methodStorage[x].invoke(DataStoragePicsObj)
    是一个数组,但它返回一个二维数组,程序无法识别,因此它需要
    tempMatrix
    作为简单数组,或者
    methodStorage[]
    作为二维数组。我需要帮助解决那个错误

    这是
    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*/
      }
    
    说到java/编码,我是一个初学者,所以请不要使用复杂的术语

    教学大纲的答案对我有所帮助,但我仍然得到了这个错误:“线程中的异常”main“java.lang.ClassCastException:java.lang.Class不能转换为[[I”事情是铸造,它存储和返回屏幕上的东西。有时它显示错误,在最后,有时在中间。不知道为什么。< /强>

    实际上,没有“CAST”,编译器只考虑<代码>调用Ky/<代码>返回<代码>对象< /代码> .<
    tempMatrix[16][10]
    表示
    tempMatrix
    数组中的元素(16,10),因此其类型为
    int

    因此,将对象分配给int会引发编译器错误:“=”后面的类型必须是“相同的”

    首先,必须将调用返回的对象强制转换为
    int[][]
    。 然后您必须指定给int[][]对象(完整的tempMatrix?)


    您正在遍历类中的所有方法,并将每个方法的返回值强制转换为
    int[][]

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

    什么是
    tempMatrix
    的类型?您还没有向我们展示如何创建它。DataStoragePics类中的所有方法都返回int[][]没有任何其他返回类型的方法没有void方法,没有int方法,没有double,没有char,没有string,没有float,没有int[],这些类型都只是int[]@user3144079请再次阅读我的答案。
    DataStoragePicsObj
    java.lang.Object
    继承方法(就像任何java类一样,您不能抑制此操作),为什么不试试我的解决方案并检查它是否有效?@user3144079如果您添加语句
    System.out.println(methodStorage[x].getName())
    您会发现导致异常的方法名为
    getClass
    。我尝试了解决方案,并执行了getName()操作,现在我明白了,问题已经解决。感谢您在回答后抽出时间。
    tempMatrix = (int[][]) methodStorage[x].invoke(DataStoragePicsObj);
    
    Method[] methodStorage = DataStoragePicsObj.getClass().getMethods();
    
    //Loops through methodStorage[].
      for(int x = 0; x < method.length; x++)
    
        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;
        }