gpt4 book ai didi

java - 带有反射的 ClassCastException

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:33 26 4
gpt4 key购买 nike

我尝试通过反射来分析运行时信息。我尝试分析的类有一个 me.instrumentor.InstrumentStackElem 类型的静态数组,我想使用反射来访问和复制它。

代码如下所示:

final Field stack = this.object.getClass().getDeclaredField("ise_array");
stack.setAccessible(true);
final Object arr = stack.get(null);
final InstrumentStackElem[] tmp = new InstrumentStackElem[Array.getLength(arr)];
for (int i = 0; i < tmp.length; i++) {
tmp[i] = (InstrumentStackElem) Array.get(arr, i);
}

当我尝试运行它时,我在 for 循环中的行得到 java.lang.ClassCastException: me.instrumentor.InstrumentStackElem 无法转换为 me.instrumentor.InstrumentStackElem

有人可以帮助我吗?

最佳答案

如果您处理原始对象就足够了,您可以尝试此解决方案。它使您能够使用任意类型,而且您不必担心不同的类加载器。我想,正确实现的 toString() 也会有所帮助。

import java.lang.reflect.Array;
import java.lang.reflect.Field;

public class Main {

@SuppressWarnings("unused")
private static Integer[] targetArray = new Integer[] { 0, 1, 2, 3, 4, 5 };

public static void main(String[] args) throws Exception {
Field arrayMember = Main.class.getDeclaredField("targetArray");
arrayMember.setAccessible(true);

Object array = arrayMember.get(null);

int length = Array.getLength(array);

// get class of array element
Class<? extends Object> elementType = array.getClass().getComponentType();
Object copy = Array.newInstance(elementType, length);

for (int i = 0; i < length; i++) {
Array.set(copy, i, Array.get(array, i));
}

// if you know the type, you can cast
if (Integer[].class.isInstance(copy)) {
System.out.println("Integer[].class.isInstance(copy) == true");
Integer[] copiedArray = Integer[].class.cast(copy);
for (Integer i : copiedArray)
System.out.println(i);
} else {
for (int i = 0; i < length; i++) {
System.out.println(Array.get(copy, i));
}
}
}
}

输出

Integer[].class.isInstance(copy) == true
0
1
2
3
4
5

关于java - 带有反射的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27460180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com