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

在上面的例子中,我们有两个名为 agename 的私有变量。 在这里,我们试图从其他名为 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() 的方法. 在这里,我们使用反射来访问类的私有字段和方法测试.