概述
原文地址:
http://www.javaspecialists.co.za/archive/newsletter.do?issue=087&locale=zh_CN
sun.reflect.Reflection
几个礼拜前,我和我一位叫Niko Brummer的朋友聊天。他是一位音响检验方面的专家,热爱水上运动,并且喜欢把他的理论知识应用到运动中。Niko十分愿意随时与你谈论他在Java(和海洋)方面的最新发现。
我们聊天的时候,Niko提到了一个我未曾听闻的、叫作“Reflection”的类。这个类是Sun JVM一起附带的,可以在sun.reflect.*包里找到它。其中最有用的方法是: Class getCallerClass(int i)
. 这个类能告诉你在我们当前的调用堆栈中有哪些类。
让我们来看一个例子,是做汤时需要用到的一些类。(假设你想为几百人做一道美味的蔬菜汤,请看一下 我们网站上的这个菜谱 ;-) 我们希望土豆(Potato)有一个指向它所在汤(Soup)的一个引用,并且我们希望汤(Soup)明白它自己包含哪些土豆(Potato)。请记住,这个解决方法只是众多可能的一种,并且只是作为一个演示如何使用这个Reflection类的例子。
java.util.*; Soup { List potatos = ArrayList(); add(Potato p) { potatos.add(p); p.setSoup(); } String toString() { + potatos + ; } } sun.reflect.Reflection; Potato { id; Soup soup; Potato( id) { .id = id; } setSoup(Soup soup) { .soup = soup; (Reflection.getCallerClass() != Soup.) { soup.add(); } } Soup getSoup() { soup; } String toString() { + id; } }
Potato.setSoup是个有趣的方法,它检查调用它的类是否是Soup。getCallerClass采用堆栈层次作为参数,这个例子中是2。
我们可以试着做一道汤(Soap),加入一些土豆(Potato),然后把汤和一个无关联的 Potato建立关系(Association)。
SoupTest { main(String[] args) { Soup soup = Soup(); soup.add( Potato()); soup.add( Potato()); soup.add( Potato()); Potato p4 = Potato(); soup.add(p4); p4.setSoup(soup); // redundant code Potato p5 = Potato(); p5.setSoup(soup); System.out.println( + soup); } }
用java -showversion SoupTest
执行这段代码的结果:
java version "1.4.2_04" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_04-b05) Java HotSpot(TM) Client VM (build 1.4.2_04-b05, mixed mode) soup = Soup {potatos=[Potato 1, Potato 2, Potato 3, Potato 4, Potato 4, Potato 5]}
最后
以上就是任性绿茶为你收集整理的得知引用类,很有意思sun.reflect.Reflection的全部内容,希望文章能够帮你解决得知引用类,很有意思sun.reflect.Reflection所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复