繁体   English   中英

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

[英]How to return a 2D array using Reflection?

守则的目的

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

我是如何解决这个问题的

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

我需要帮助的是什么

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

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

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

教学大纲的答案有所帮助,但我仍然得到这个错误:“线程中的异常”主“java.lang.ClassCastException:java.lang.Class无法强制转换为[[I”该东西正在转换并且它存储并返回屏幕上的内容。 有时它有时会在中间显示错误。 不知道为什么。

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

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

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

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

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

您正在循环遍历您班级中的所有方法。 并将每个方法的返回值转换为int[][]

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

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

这当然会失败,因为您的DataStoragePicsObj类隐式扩展了java.lang.Object ,它具有不返回int[][] hashCodetoStringgetClass等方法。

如果通过反射调用方法,则应该准备好向它传递正确的参数和过程它的返回值; 如果不能,则不应通过反射调用该方法。

你能做什么 - 如果我对你想做的事情的理解是正确的 - 是检查返回类型和参数,以确保你准备好处理反射调用:

    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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM