Java对象在调试器中具有属性但没有getter方法

时间:2013-03-03 02:44:54

标签: java groovy

当我通过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 Interface PhoneCall的一个实例,调试器显示的类型为PhoneCallImpl(接口的第三方实现)。我无法访问该第三方的源代码以便了解,但是Interface有完整的文档和API的Javadoc。

3 个答案:

答案 0 :(得分: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是私有的,但允许访问它。

但是,通常有一个字段是私有的原因,如果你的代码在你操作的第三方代码的后续版本中断,你不应该感到惊讶。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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