Java 程序访问类的私有成员
要理解此示例,您应该具备以下 Java 编程的知识:
示例 1:使用 getter 和 setter 方法访问私有字段
public class Test {
// private variables
private int age;
private String name;
// initialize age
public void setAge(int age) {
this.age = age;
}
// initialize name
public void setName(String name) {
this.name = name;
}
// access age
public int getAge() {
return this.age;
}
// access name
public String getName() {
return this.name;
}
}
public class Main {
public static void main(String[] args) {
// create an object of Test
Test test = new Test();
// set value of private variables
test.setAge(24);
test.setName("Tim");
// get value of private variables
System.out.println("Age: " + test.getAge());
System.out.println("Name: " + test.getName());
}
}
输出
Age: 24
Name: Tim
在上面的例子中,我们有两个名为 age
和 name
的私有变量。 在这里,我们试图从其他名为 Main
的类访问私有变量.
我们使用了 getter 和 setter 方法来访问私有变量。这里,
- setter 方法
setAge()
和setName()
初始化私有变量 - getter 方法
getAge()
和getName()
返回私有变量的值
示例 2:使用反射访问私有字段和方法
import java.lang.reflect.*;
public class Test {
// private variables
private String name;
// private method
private void display() {
System.out.println("The name is " + name);
}
}
public class Main {
public static void main(String[] args) {
try {
// create an object of Test
Test test = new Test();
// create an object of the class named Class
Class obj = test.getClass();
// access the private variable
Field field = obj.getDeclaredField("name");
// make private field accessible
field.setAccessible(true);
// set value of field
field.set(test, "Tim");
// get value of field
// and convert it in string
String value = (String)field.get(test);
System.out.println("Name: " + value);
// access the private method
Method[] methods = obj.getDeclaredMethods();
System.out.println("Method Name: " + methods[0].getName());
int modifier = methods[0].getModifiers();
System.out.println("Access Modifier: " + Modifier.toString(modifier));
}
catch(Exception e) {
e.printStackTrace();
}
}
}
输出
Name: Tim
Method Name: display
Access Modifier: private
在这个例子中,我们有一个名为 name
的私有字段和一个名为 display()
的方法. 在这里,我们使用反射来访问类的私有字段和方法测试.