操作类的私有属性
get/set方法
一般类私有属性有提供get/set方法,就使用get/set方法来操作这个类实例的私有属性.
反射
如果类没有提供get/set方法,无法直接操作私有属性,这时候可以使用反射来进行访问和修改.
import java.lang.reflect.Field;
/**
* 没提供get/set, 使用反射的方式修改字段的值
*/
public class Father {
private String name = "A";
@Override
public String toString() {
return "Father{" +
"name='" + name + '\'' +
'}';
}
public static void main(String[] args) {
Father father = new Father();
System.out.println("使用反射修改前:" + father);
Class<? extends Father> fatherClass = father.getClass();
try {
// 获取类的私有字段 name
Field name = fatherClass.getDeclaredField("name");
// 设置为可以访问
name.setAccessible(true);
// 修改实例father中的字段name
name.set(father, "B");
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println("使用反射修改后:" + father);
}
}
子类继承父类
如果是子类继承父类且父类没有提供get/set, 父类的私有属性也是无法直接访问和修改的, 需要通过反射来操作父类的私有属性.
import java.lang.reflect.Field;
/**
* 子类继承父类, 操作私有属性
*/
public class Son extends Father {
public static void main(String[] args) {
Son son = new Son();
System.out.println("修改前:" + son);
Class clazz = son.getClass().getSuperclass();
try {
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(son, "B");
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println("修改后:" + son);
}
}