【发布时间】:2012-12-11 19:27:06
【问题描述】:
可能重复:
Is it possible in Java to access private fields via reflection
有什么办法可以让我们在java中调用一个类的私有数据成员,可以在类外访问。 我想要一个棘手的问题库。 根据我的 Java 经验,我认为这是可能的,但我不知道该怎么做。
【问题讨论】:
标签: java private data-members
可能重复:
Is it possible in Java to access private fields via reflection
有什么办法可以让我们在java中调用一个类的私有数据成员,可以在类外访问。 我想要一个棘手的问题库。 根据我的 Java 经验,我认为这是可能的,但我不知道该怎么做。
【问题讨论】:
标签: java private data-members
根据 Java 语言规范,第 3 版:
6.6.8 Example: private Fields, Methods, and Constructors
A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor. It is not inherited by subclasses.
您可以在 java 中使用reflection 来访问私有字段。理想情况下,您应该使用公共 setter 和 getter 方法从类外部访问此类数据(正如其他人发布的那样)
【讨论】:
定义一个公共的get 方法来获取你的类的私有字段。
【讨论】:
不,你不能通过任何方式访问 java 中的私有变量。
您可以提供公共 getter 和 setter 方法来访问或更改私有成员变量的值。
【讨论】:
【讨论】:
有关访问修饰符的更多信息,请查看以下链接
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
这用于通过反射访问 Java 中的私有变量
【讨论】:
1) 如果 SecurityManager 允许,您可以使用反射来完成
class B {
private int x = 2;
}
public class A {
public static void main(String[] args) throws Exception {
Field f = B.class.getDeclaredField("x");
f.setAccessible(true);
f.get(new B());
}
}
2) 在内部类的情况下
class A {
private int a = 1;
class B {
private int b = 2;
private void xxx() {
int i = new A().a;
};
}
private void aaa() {
int i = new B().b;
}
【讨论】:
您可以使用返回/设置私有字段值的公共方法来做到这一点。
public Class A{
private String myData;
public String getMyData(){
return myData;
}
public void setMyData(String data){
this.myData=data;
}
}
【讨论】: