Доступ к приватным полям класса в 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».