一道有关Java反射机制的趣味题
我有很多次拿一道Java题跟我们的实习生开玩笑。目的并不是考他们,而是要向他们展现编程中的一个初学者不太会注意的重要功能。 这道题要求不能修改本文标题上面截图中的Object1类,另外写一个Java程序,并能读出Object1对象中变量i的值。 曾有一个实习生问我,变量i是一个private成员,按理说在别的类里是访问不到的呀?按照“常规”方法确实是这样,但我举了一个反例,如下图所示。Java debugger能够读到这个private变量。 探寻一个Java类中各个成员(构造函数,变量,方法等),或者一个Java对象在运行过程中的实时状态,可以通过Java reflection实现。上面趣味题的答案也很简单。 为了探寻一个Java类的结构,首先需要获得这个类的信息。Class myClass = Class.forName(“xyz.q1.Object1”); 然后通过Class类的实例获取Object1类中各成员定义。由于在Object1类中的成员变量i具有private属性,直接访问在各个成员会导致IllegalAccessException异常,因此在访问各个成员之前,应当检测正要访问的成员是否具有private属性。一旦检测到private属性,必须通过field.setAccessible(true);设置防止权限。在获得了一个成员变量(field)的信息以后,可以很容易地获得该变量的变量名,数据类型,以及当前的值。 上面是一个简单的通过Java reflection读取一个Java对象实时状态的实例。通过Java reflection不但可以读取一个Java对象中的变量,也能够直接访问这个这个Java对象中的方法,甚至可以模拟应用程序中的方法调用。
Read More