日期:2011-03-22 16:17:00 来源:本站整理
一个java类办法提取器[Java编程]
本文“一个java类办法提取器[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
很少需求直接利用反射工具;之所以在语言中供应它们,仅仅是为了支持其他Java特点,比方对象序列化(第10章介绍)、Java Beans以及RMI(本章背面介绍).但是,我们很多时刻仍旧需求动态提取与一个类有关的资料.此中分外有效的工具就是一个类办法提取器.正如前面指出的那样,若检视类定义源码大概联机文档,只能看到在那个类定义中被定义或覆盖的办法,底子类那边还有大量资料拿不到.幸运的是,“反射”做到了这一点,可用它写一个简单的工具,令其自动展示整个接口.下面就是具体的程序:
Class办法getMethods()和getConstructors()可以辨别返回Method和Constructor的一个数组.每个类都供应了进一步的办法,可解析出它们所代表的办法的名字、参数以及返回值.但也可以象这样一样只利用toString(),生成一个含有完好办法签名的字串.代码剩余的部份只是用于提取号令行信息,判断特定的签名能否与我们的目标字串符合(利用indexOf()),并打印出后果.//: ShowMethods.java // Using Java 1.1 reflection to show all the // methods of a class, even if the methods are // defined in the base class. import java.lang.reflect.*; public class ShowMethods { static final String usage = "usage: \n" + "ShowMethods qualified.class.name\n" + "To show all methods in class or: \n" + "ShowMethods qualified.class.name word\n" + "To search for methods involving 'word'"; public static void main(String[] args) { if(args.length < 1) { System.out.println(usage); System.exit(0); } try { Class c = Class.forName(args[0]); Method[] m = c.getMethods(); Constructor[] ctor = c.getConstructors(); if(args.length == 1) { for (int i = 0; i < m.length; i++) System.out.println(m[i].toString()); for (int i = 0; i < ctor.length; i++) System.out.println(ctor[i].toString()); } else { for (int i = 0; i < m.length; i++) if(m[i].toString() .indexOf(args[1])!= -1) System.out.println(m[i].toString()); for (int i = 0; i < ctor.length; i++) if(ctor[i].toString() .indexOf(args[1])!= -1) System.out.println(ctor[i].toString()); } } catch (ClassNotFoundException e) { System.out.println("No such class: " + e); } } } ///:~
这里便用到了“反射”技术,因为由Class.forName()产生的后果不能在编译期间获知,所以全部办法签名信息城市在运行期间提取.若研究一下联机文档中关于“反射”(Reflection)的那部份文字,就会发现它已供应了充足多的支持,可对一个编译期完好未知的对象举行实际的设置以及发出办法调用.一样地,这也属于几近完好不用我们操心的一个步骤——Java自己会操纵这种支持,所以程序计划环境可以掌握Java Beans——但它无论若何都是非常风趣的.
一个风趣的试验是运行java ShowMehods ShowMethods.这样做可得到一个列表,此中包含一个public默许构建器,固然我们在代码中瞥见并没有定义一个构建器.我们看到的是由编译器自动合成的那一个构建器.假如随之将ShowMethods设为一个非public类(即换成“友好”类),合成的默许构建器便不会在输出后果中呈现.合成的默许构建器会自动得到与类一样的拜候权限.
ShowMethods的输出仍旧有些“不爽”.比方,下面是通过调用java ShowMethods java.lang.String得到的输出后果的一部份:
若能去掉象java.lang这样的限定词,后果明显会更令人称心.有鉴于此,可引入上一章介绍的StreamTokenizer类,办理这个问题:public boolean java.lang.String.startsWith(java.lang.String,int) public boolean java.lang.String.startsWith(java.lang.String) public boolean java.lang.String.endsWith(java.lang.String)
ShowMethodsClean办法非常接近前一个ShowMethods,只是它获得了Method和Constructor数组,并将它们转换成单个String数组.随后,每个这样的String对象都在StripQualifiers.Strip()里“过”一遍,删除全部办法限定词.正如大家看到的那样,此时用到了StreamTokenizer和String来完成这个工作.//: ShowMethodsClean.java // ShowMethods with the qualifiers stripped // to make the results easier to read import java.lang.reflect.*; import java.io.*; public class ShowMethodsClean { static final String usage = "usage: \n" + "ShowMethodsClean qualified.class.name\n" + "To show all methods in class or: \n" + "ShowMethodsClean qualif.class.name word\n" + "To search for methods involving 'word'"; public static void main(String[] args) { if(args.length < 1) { System.out.println(usage); System.exit(0); } try { Class c = Class.forName(args[0]); Method[] m = c.getMethods(); Constructor[] ctor = c.getConstructors(); // Convert to an array of cleaned Strings: String[] n = new String[m.length + ctor.length]; for(int i = 0; i < m.length; i++) { String s = m[i].toString(); n[i] = StripQualifiers.strip(s); } for(int i = 0; i < ctor.length; i++) { String s = ctor[i].toString(); n[i + m.length] = StripQualifiers.strip(s); } if(args.length == 1) for (int i = 0; i < n.length; i++) System.out.println(n[i]); else for (int i = 0; i < n.length; i++) if(n[i].indexOf(args[1])!= -1) System.out.println(n[i]); } catch (ClassNotFoundException e) { System.out.println("No such class: " + e); } } } class StripQualifiers { private StreamTokenizer st; public StripQualifiers(String qualified) { st = new StreamTokenizer( new StringReader(qualified)); st.ordinaryChar(' '); // Keep the spaces } public String getNext() { String s = null; try { if(st.nextToken() != StreamTokenizer.TT_EOF) { switch(st.ttype) { case StreamTokenizer.TT_EOL: s = null; break; case StreamTokenizer.TT_NUMBER: s = Double.toString(st.nval); break; case StreamTokenizer.TT_WORD: s = new String(st.sval); break; default: // single character in ttype s = String.valueOf((char)st.ttype); } } } catch(IOException e) { System.out.println(e); } return s; } public static String strip(String qualified) { StripQualifiers sq = new StripQualifiers(qualified); String s = "", si; while((si = sq.getNext()) != null) { int lastDot = si.lastIndexOf('.'); if(lastDot != -1) si = si.substring(lastDot + 1); s += si; } return s; } } ///:~
假定记不得一个类能否有一个特定的办法,并且不想在联机文档里渐渐查抄类构造,大概不知道那个类能否能对某个对象(如Color对象)做某件事情,该工具便可节俭大量编程时间.
第17章供应了这个程序的一个GUI版本,可在自己写代码的时刻运行它,以便快速查找需求的东西.
以上是“一个java类办法提取器[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:<b>java rtti学习总结</b>
- ·下一篇文章:反射:运行期类信息
- ·中查找“一个java类办法提取器”更多相关内容
- ·中查找“一个java类办法提取器”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论