一般来说,成员变量都是用private来修饰,也就是说外部是访问不了的,无法直接修改,一般就是提供set与get接口来进行访问,比如下面这样
Demo6.java
package pxx;
class TestDemo6 {
private int age = 655;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
class Demo6{
public static void main(String[] args) {
TestDemo6 testDemo6 = new TestDemo6();
System.out.println(testDemo6.getAge());
testDemo6.setAge(520);
System.out.println(testDemo6.getAge());
}
}
运行结果:
上面就是利用set来进行年龄的修改。
但是假如没有set这样一个外部接口的类呢,又改如何修改呢?或者说能不能修改呢,把类做如下修改
Demo6.java
package pxx;
class TestDemo6 {
private int age = 655;
public int getAge() {
return age;
}
}
class Demo6{
public static void main(String[] args) {
TestDemo6 testDemo6 = new TestDemo6();
System.out.println(testDemo6.getAge());
}
}
ok ,虽然没有set接口,那么我们就想到用反射技术来获取这个类的Class对象,然后在来获取私有成员变量,在利用set方法,把这个值修改成自己想要的。
Demo6.java
package pxx;
import java.lang.reflect.Field;
class TestDemo6 {
private int age = 655;
public int getAge() {
return age;
}
}
class Demo6{
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
TestDemo6 testDemo6 = new TestDemo6();
System.out.println(testDemo6.getAge());
Class testClass = Class.forName("pxx.TestDemo6");
Field field = testClass.getDeclaredField("age");
//对私有属性暴力破解
field.setAccessible(true);
field.set(testDemo6,23);
System.out.println(testDemo6.getAge());
}
}
运行结果: