当我通过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。
答案 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正在做的事情)