好的,我试图自己解决这个问题,但我有点难过。我试图修复一个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
。
非常感谢任何帮助。谢谢!
答案 0 :(得分:1)
实例字段附加到实例。它本身并不存在。
Field#get(Object)
方法javadoc陈述
返回此字段表示的字段的值, 指定的对象。该值自动包装在对象中 它有原始类型。
换句话说,您需要通过传递获取字段值的对象(实例)来调用get
(如果字段为{null
{1}})。您正在为声明该字段的类传递static
对象。