抓住非公共领域的Java反射

时间:2012-12-29 04:39:49

标签: java reflection

我在使用Java中的反射抓取类中的字段时遇到了麻烦:

public class CraftLib
{
    static List alloyRecipes = new ArrayList();
    public static HashSet damageOnCraft = new HashSet();
    public static HashMap damageContainer = new HashMap();

public static void addAlloyResult(ur output, Object[] input)
{
    alloyRecipes.add(Arrays.asList(new Object[] { input, output }));
}
//file continues

我尝试抓住这样的字段:

try {
    Field[] fields = Class.forName("class.path").getFields();
    for(Field f : fields) {
    System.out.println(f.getName());
} catch (ClassNotFoundException e) {
    System.out.println("Damn.");
}
System.out.println(fields.length);

出于某种原因,它只能抓取damageOnCraftdamageContainer字段,但我真正需要的字段alloyRecipes不会被抓取。我无法编辑第一个文件,那么获取和编辑该字段的最佳方法是什么?

2 个答案:

答案 0 :(得分:9)

getFields()如果无法访问,则不会向您提供私有,受包保护或受保护的字段。

  

(getFields())返回一个数组,其中包含反映此Class对象所代表的类或接口的所有可访问公共字段的Field对象

显然,您的包受保护的alloyRecipes无法访问。

您需要getDeclaredFields()

  

(getDeclaredFields())返回Field对象的数组,这些对象反映由此Class对象表示的类或接口声明的所有字段。此包括公共,受保护,默认(包)访问和私有字段,但不包括继承的字段。

答案 1 :(得分:0)

将您的类放在与另一个包相同的包中,然后它就能读取包受保护的字段。