[英]How to return a 2D array using Reflection?
守则的目的
通过将其与已存在的像素集(在DataStoragePics
类中以返回2D数组的方法的形式)进行比较,找出屏幕上的图片。
我是如何解决这个问题的
methodStorage[]
存储了DataStoragePics
类中的所有方法。 methodStorage[]
调用一个方法,然后将其存储在tempMatrix[][]
。 我需要帮助的是什么
当我尝试使用上面提到的步骤解决问题时,我在主类的底部第三行重复两次错误:
此行的多个标记 - 类型不匹配:无法从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[][]
hashCode
, toString
和getClass
等方法。
如果通过反射调用方法,则应该准备好向它传递正确的参数和过程它的返回值; 如果不能,则不应通过反射调用该方法。
你能做什么 - 如果我对你想做的事情的理解是正确的 - 是检查返回类型和参数,以确保你准备好处理反射调用:
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.