我尝试用反射来分析运行时信息。我尝试分析的类有一个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 cannot be cast to me.instrumentor.InstrumentStackElem
。
任何人都可以帮助我吗?
答案 0 :(得分:1)
如果它足以让您处理原始对象,则可以尝试此解决方案。它使您可以使用任意类型,而且您不必担心不同的类加载器。正确实施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