如何使用Java反射访问私有数组?

时间:2014-04-10 22:33:42

标签: java arrays reflection minecraft

好的,我试图自己解决这个问题,但我有点难过。我试图修复一个mod for minecraft中的一些代码错误。除了这个之外,我得到了很多修复。

基本上这个家伙mod想要访问它所扩展的超类中的一个数组field_94586_c。编写代码时,变量是公共范围的。现在在更高版本中,它已被更改为私有范围。我正在玩Java反射来尝试访问变量,以便我可以将所需的数据写入其中。

此处适用的代码段...

@Override
@SideOnly(Side.CLIENT)
/**
 * Gets an icon index based on an item's damage value
 */
public Icon getIconFromDamage(int par1)
{

    if (par1 < 0 || par1 >= skullTypes.length) {
        par1 = 0;
    }

    return field_94586_c[par1];
}

@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IconRegister par1IconRegister)
{

    field_94586_c = new Icon[field_94587_a.length];

    for (int i = 0; i < field_94587_a.length; ++i)
        if (i >= 5)
            field_94586_c[i] = par1IconRegister.registerIcon("iguanatweakstconstruct:" + field_94587_a[i]);
        else
            field_94586_c[i] = par1IconRegister.registerIcon(getIconString() + "_" + field_94587_a[i]);
}

基本上我需要将数组的修改版本写入超类。他在阵列中添加了一些新项目。

我最初的尝试是使用&#34;反射器&#34; class将对象返回给我。但问题是我无法弄清楚如何将对象转换为Icon[]。我尝试过它,但Java抱怨这是不可能的。我没有原始错误。

这是我的反射课......

package iguanaman.iguanatweakstconstruct.util;

import java.lang.reflect.Field;

/**
* Created by Ian on 4/10/2014.
*/
public class IguanaReflector {

public static Object modifyAccess(final String className, final String filedName) throws SecurityException, NoSuchFieldException, ClassNotFoundException, IllegalArgumentException, IllegalAccessException {

    final Field field = Class.forName(className).getDeclaredField(filedName);
    field.setAccessible(true);

    return field.get(Class.forName(className));

}

}

它并不多,而且说实话,它基于一些在网上四处看看。

我尝试访问的完整软件包名称为net.minecraft.item.ItemSkull,字段为field_94586_c

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

实例字段附加到实例。它本身并不存在。

Field#get(Object)方法javadoc陈述

  

返回此字段表示的字段的值,   指定的对象。该值自动包装在对象中   它有原始类型。

换句话说,您需要通过传递获取字段值的对象(实例)来调用get(如果字段为{null {1}})。您正在为声明该字段的类传递static对象。