最近我遇到了反射 API,令我惊讶的是我们可以访问甚至更改私有变量。我尝试了以下代码
import java.lang.reflect.Field;
public class SomeClass{
private String name = "John";
}
public class Test{
public static void main(String args[]) throws Exception {
SomeClass myClass = new SomeClass();
Field fs = myClass.getClass().getDeclaredField("name");
fs.setAccessible(true);
System.out.println("Variable is " + fs.getName() + " and value is "
+ fs.get(myClass));
fs.set(myClass, "Sam");
System.out.println("Variable is " + fs.getName() + " and value is "
+ fs.get(myClass));
}
}
我得到了以下输出。
Variable is name and value is John
Variable is name and value is Sam
我们说Java是一种面向对象的语言,它的主要特点是数据封装、继承、多态……等等。反射API不是改变了数据封装的目的吗?为什么我们必须使用反射 API?我在一些网站上读到它可以用于测试目的,但根据我的说法,模块已经过测试,并且可以使用 JUnit 测试用例轻松完成。那么任何人都可以解释为什么我们有这样的黑客吗?