anoyne可以推荐一个好的库,让我可以轻松读/写一个类的私有成员字段吗?我正在浏览apache的公地,但看不到它。我一定是瞎了吗?
编辑:在合法性边界提出问题时,总是会提出“为什么”这些问题?我正在为hotswapping类编写几个javarebel插件。访问私有变量只是第1步,我甚至可能必须替换某些方法的实现。
答案 0 :(得分:7)
在大多数情况下,java reflection解决了这个问题:
示例:
public class Foo {
/**
* Gets the name Field.
*
* @return the name
*/
public final String getName() {
return name;
}
/**
* Sets the name Field with the name input value.
*
* @param name the name to set
*/
public final void setName(String name) {
this.name = name;
}
private String name;
}
现在反思代码:
import java.lang.reflect.Field;
....
Foo foo = new Foo();
foo.setName("old Name");
String fieldName = "name";
Class class1 = Foo.class;
try {
System.out.println(foo.getName());
Field field = class1.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(foo, "My New Name");
System.out.println(foo.getName());
} catch (NoSuchFieldException e) {
System.out.println("FieldNotFound: " + e);
} catch (IllegalAccessException e) {
System.out.println("Ilegal Access: " + e);
}
<强>更新强>
值得一提的是,SecurityManager可以阻止这种方法。 - 丹·戴尔
答案 1 :(得分:3)
在不知道您为何需要这种级别的访问权限的情况下,我只能想知道您可能需要该级别的访问权限。私人会员是私人的有一个原因。它们不打算从课外访问,可能导致无证件行为。
也就是说,您可以通过java.lang.reflect包访问大多数内容。
在我看来,你应该检查为什么你认为你需要这种访问级别,看看你是否可以采取不同的做法而不需要它。
答案 2 :(得分:1)
java.lang.reflect
包类和方法允许在一定限制内进行此访问。