Articles by Xin Yi Zhang

威廉坎贝尔爵士故居

威廉坎贝尔(1758.8.2–1834.1.18)生于苏格兰。在美国独立战争期间参加英军前往北美,1781年被俘后关押在弗吉尼亚。三年后威廉坎贝尔前往Nova Scotia定居,并在那里学习了法律。他1785起开始从事律师行业,几年后被任命为法官。1799年他代表Sydney县参选赢得了Nova Scotia议会的一个席位。1811年威廉坎贝尔获得皇座法庭法官的任命,迁居到上加拿大的约克(今多伦多)。1825年获任上加拿大省的首席法官和立法院的议长。1829年威廉坎贝尔因为健康原因退休。 坎贝尔故居建于1822年,是多伦多第一栋砖砌建筑,是多伦多遗留的为数不多的格鲁吉亚时代的建筑之一,也是多伦多现存最古老的民宅之一。 这栋建筑原先坐落于多伦多Adelaide St. East和Frederick St.,离现在的位置大约相距1.5公里。原来的地点现在为George Brown学院所有。这栋建筑在18世纪的大部分时间里都是一栋私人住宅。进入20世纪后被改作办公室和工厂。后来这栋建筑因年久失修,非常破败。最后一任房主想扩建公司的停车场,希望拆除这栋建筑。任何人如果能把这栋建筑从该地块移走,就可以得到它。一个专业律师协会闻讯后想方设法抢救了这栋建筑,1972年3 月31日这栋建筑被移动到了现址。这个协会随后对建筑进行了修复,成为了今天的展览馆。 地址:160 Queen St. W Toronto ON M5H 3H3 网站:http://www.campbellhousemuseum.ca/


一道有关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对象中的方法,甚至可以模拟应用程序中的方法调用。


Translate »