Доступ к приватным полям класса в Java — через геттеры и Reflection

К приватным (private) полям класса нельзя обратиться напрямую из других классов. Но есть два корректных способа: использовать пару геттер/сеттер или воспользоваться рефлексией.

Пример 1: доступ к приватным полям через геттеры и сеттеры

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;
  }

}

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("Programiz");

    // get value of private variables
    System.out.println("Age: " + test.getAge());
    System.out.println("Name: " + test.getName());
  }
}

Вывод:

Age: 24
Name: Programiz

В этом примере есть приватные переменные с именами age и name. Мы пытаемся обратиться к этим приватным переменным из другого класса Main.

Для доступа использованы геттер- и сеттер-методы:

Примечание

  • сеттеры setAge() и setName() инициализируют приватные переменные;

  • геттеры getAge() и getName() возвращают значения приватных переменных.

Пример 2: доступ к приватному полю и методу через рефлексию (Reflection)

import java.lang.reflect.*;

class Test {

  // private variables
  private String name;

  // private method
  private void display() {
    System.out.println("The name is " + name);
  }

}

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, "Programiz");

      // 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: Programiz
Method Name: display
Access Modifier: private

В этом примере есть приватное поле name и приватный метод display(). Чтобы добраться до них из другого класса, мы используем рефлексию.

Совет

Подробнее о механизме рефлексии можно почитать в отдельной статье «Java Reflection».