0

当我通过 Java 代码进行调试时,我经常在我的应用程序中看到很多对我有用的对象属性来获取它们并使用它们做一些事情,但是我查看 API 或 javadocs,该类没有任何此类属性或 getter获取这些属性值的方法。例如:

myPhoneCallObj.foo  has value "bar" in debugger
myPhoneCallObj.baz has value otherObj which in turn has other values like otherObj.baz

我不能用 Java 做:

String myValue = myPhoneCallObj.foo

因为它不会在 Java 中编译,但在 Groovy 中我可以编写上面的代码,并且在运行时,它会得到我需要的值。如何在 Java 代码中完成相同的操作?

myPhoneCallObj 是 Java 接口 PhoneCall 的一个实例,调试器将其显示为 PhoneCallImpl 类型(接口的第三方实现)。我无权访问该第三方的源代码以了解了解,但该接口具有完整的文档和 API 的 Javadoc。

4

3 回答 3

1

给定一个像这样的类:

class X
{
    private int value;

    @Override
    public String toString()
    {
        return (Integer.toString(value));
    }
}

你可以这样做:

import java.lang.reflect.Field;


public class Test 
{
    public static void main(final String[] argv) 
        throws NoSuchFieldException, 
               IllegalArgumentException,
               IllegalAccessException
    {
        final X x;

        x = new X();
        System.out.println(x);
        changeValue(x);
        System.out.println(x);
    }

    private static void changeValue(final X x) 
        throws NoSuchFieldException, 
               IllegalArgumentException,
               IllegalAccessException
    {
        final Class<X> clazz;
        final Field    field;

        clazz = X.class;
        field = clazz.getDeclaredField("value");
        field.setAccessible(true);
        field.set(x, Integer.MAX_VALUE);
    }
}

这里的关键是调用field.setAccessible(true);它说即使value是私有的也允许它被访问。

但是,字段是私有的通常是有原因的,如果您的代码因您正在操作的第 3 方代码的更高版本而中断,您不应该感到惊讶。

于 2013-03-03T05:56:28.973 回答
0

这些属性是私有的还是在范围内受保护的?您可以直接访问的唯一属性是公共属性,但所有变量都将显示在调试对象检查器中。

于 2013-03-03T03:56:19.413 回答
0

如果您绝对需要获取值,则可以使用反射。(这可能是 Groovy 正在做的事情)

于 2013-03-03T05:47:40.037 回答