仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1150|回复: 19
打印 上一主题 下一主题

[学习教程] 来看一个java类办法提取器

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:35:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。
很少必要间接利用反射工具;之以是在言语中供应它们,仅仅是为了撑持其他Java特征,好比对象序列化(第10章先容)、JavaBeans和RMI(本章前面先容)。可是,我们很多时分仍旧必要静态提取与一个类有关的材料。个中出格有效的工具即是一个类办法提取器。正如后面指出的那样,若检视类界说源码大概联机文档,只能看到在谁人类界说中被界说或掩盖的办法,基本类那边另有大批材料拿不到。侥幸的是,“反射”做到了这一点,可用它写一个复杂的工具,令其主动展现全部接口。上面即是详细的程序:
  1. //:ShowMethods.java
  2. //UsingJava1.1reflectiontoshowallthe
  3. //methodsofaclass,evenifthemethodsare
  4. //definedinthebaseclass.
  5. importjava.lang.reflect.*;
  6. publicclassShowMethods{
  7. staticfinalStringusage=
  8. "usage:
  9. "+
  10. "ShowMethodsqualified.class.name
  11. "+
  12. "Toshowallmethodsinclassor:
  13. "+
  14. "ShowMethodsqualified.class.nameword
  15. "+
  16. "Tosearchformethodsinvolvingword";
  17. publicstaticvoidmain(String[]args){
  18. if(args.length<1){
  19. System.out.println(usage);
  20. System.exit(0);
  21. }
  22. try{
  23. Classc=Class.forName(args[0]);
  24. Method[]m=c.getMethods();
  25. Constructor[]ctor=c.getConstructors();
  26. if(args.length==1){
  27. for(inti=0;i<m.length;i++)
  28. System.out.println(m[i].toString());
  29. for(inti=0;i<ctor.length;i++)
  30. System.out.println(ctor[i].toString());
  31. }
  32. else{
  33. for(inti=0;i<m.length;i++)
  34. if(m[i].toString()
  35. .indexOf(args[1])!=-1)
  36. System.out.println(m[i].toString());
  37. for(inti=0;i<ctor.length;i++)
  38. if(ctor[i].toString()
  39. .indexOf(args[1])!=-1)
  40. System.out.println(ctor[i].toString());
  41. }
  42. }catch(ClassNotFoundExceptione){
  43. System.out.println("Nosuchclass:"+e);
  44. }
  45. }
  46. }///:~
复制代码
Class办法getMethods()和getConstructors()能够分离前往Method和Constructor的一个数组。每一个类都供应了进一步的办法,可剖析出它们所代表的办法的名字、参数和前往值。但也能够象如许一样只利用toString(),天生一个含有完全办法署名的字串。代码残剩的部分只是用于提取命令行信息,判别特定的署名是不是与我们的方针字串符合(利用indexOf()),并打印出了局。
这里便用到了“反射”手艺,由于由Class.forName()发生的了局不克不及在编译时代获知,以是一切办法署名信息城市在运转时代提取。若研讨一下联机文档中关于“反射”(Reflection)的那部分笔墨,就会发明它已供应了充足多的撑持,可对一个编译期完整未知的对象举行实践的设置和收回办法挪用。一样地,这也属于几近完整不必我们费心的一个步骤——Java本人会使用这类撑持,以是程序计划情况可以把持JavaBeans——但它不管怎样都长短常风趣的。
一个风趣的实验是运转javaShowMehodsShowMethods。如许做可失掉一个列表,个中包含一个public默许构建器,只管我们在代码中瞥见并没有界说一个构建器。我们看到的是由编译器主动分解的那一个构建器。假如随之将ShowMethods设为一个非public类(即换成“友爱”类),分解的默许构建器便不会在输入了局中呈现。分解的默许构建器会主动取得与类一样的会见权限。
ShowMethods的输入仍旧有些“不爽”。比方,上面是经由过程挪用javaShowMethodsjava.lang.String失掉的输入了局的一部分:
  1. publicboolean
  2. java.lang.String.startsWith(java.lang.String,int)
  3. publicboolean
  4. java.lang.String.startsWith(java.lang.String)
  5. publicboolean
  6. java.lang.String.endsWith(java.lang.String)
复制代码
若能往失落象java.lang如许的限制词,了局明显会更使人中意。有鉴于此,可引进上一章先容的StreamTokenizer类,办理这个成绩:
  1. //:ShowMethodsClean.java
  2. //ShowMethodswiththequalifiersstripped
  3. //tomaketheresultseasiertoread
  4. importjava.lang.reflect.*;
  5. importjava.io.*;
  6. publicclassShowMethodsClean{
  7. staticfinalStringusage=
  8. "usage:
  9. "+
  10. "ShowMethodsCleanqualified.class.name
  11. "+
  12. "Toshowallmethodsinclassor:
  13. "+
  14. "ShowMethodsCleanqualif.class.nameword
  15. "+
  16. "Tosearchformethodsinvolvingword";
  17. publicstaticvoidmain(String[]args){
  18. if(args.length<1){
  19. System.out.println(usage);
  20. System.exit(0);
  21. }
  22. try{
  23. Classc=Class.forName(args[0]);
  24. Method[]m=c.getMethods();
  25. Constructor[]ctor=c.getConstructors();
  26. //ConverttoanarrayofcleanedStrings:
  27. String[]n=
  28. newString[m.length+ctor.length];
  29. for(inti=0;i<m.length;i++){
  30. Strings=m[i].toString();
  31. n[i]=StripQualifiers.strip(s);
  32. }
  33. for(inti=0;i<ctor.length;i++){
  34. Strings=ctor[i].toString();
  35. n[i+m.length]=
  36. StripQualifiers.strip(s);
  37. }
  38. if(args.length==1)
  39. for(inti=0;i<n.length;i++)
  40. System.out.println(n[i]);
  41. else
  42. for(inti=0;i<n.length;i++)
  43. if(n[i].indexOf(args[1])!=-1)
  44. System.out.println(n[i]);
  45. }catch(ClassNotFoundExceptione){
  46. System.out.println("Nosuchclass:"+e);
  47. }
  48. }
  49. }
  50. classStripQualifiers{
  51. privateStreamTokenizerst;
  52. publicStripQualifiers(Stringqualified){
  53. st=newStreamTokenizer(
  54. newStringReader(qualified));
  55. st.ordinaryChar();//Keepthespaces
  56. }
  57. publicStringgetNext(){
  58. Strings=null;
  59. try{
  60. if(st.nextToken()!=
  61. StreamTokenizer.TT_EOF){
  62. switch(st.ttype){
  63. caseStreamTokenizer.TT_EOL:
  64. s=null;
  65. break;
  66. caseStreamTokenizer.TT_NUMBER:
  67. s=Double.toString(st.nval);
  68. break;
  69. caseStreamTokenizer.TT_WORD:
  70. s=newString(st.sval);
  71. break;
  72. default://singlecharacterinttype
  73. s=String.valueOf((char)st.ttype);
  74. }
  75. }
  76. }catch(IOExceptione){
  77. System.out.println(e);
  78. }
  79. returns;
  80. }
  81. publicstaticStringstrip(Stringqualified){
  82. StripQualifierssq=
  83. newStripQualifiers(qualified);
  84. Strings="",si;
  85. while((si=sq.getNext())!=null){
  86. intlastDot=si.lastIndexOf(.);
  87. if(lastDot!=-1)
  88. si=si.substring(lastDot+1);
  89. s+=si;
  90. }
  91. returns;
  92. }
  93. }///:~
复制代码
ShowMethodsClean办法十分靠近前一个ShowMethods,只是它获得了Method和Constructor数组,并将它们转换成单个String数组。随后,每一个如许的String对象都在StripQualifiers.Strip()里“过”一遍,删除一切办法限制词。正如人人看到的那样,此时用到了StreamTokenizer和String来完成这个事情。
假设记不得一个类是不是有一个特定的办法,并且不想在联机文档里慢慢反省类布局,大概不晓得谁人类是不是能对某个对象(如Color对象)做某件事变,该工具即可节俭大批编程工夫。
第17章供应了这个程序的一个GUI版本,可在本人写代码的时分运转它,以便疾速查找必要的工具。
java是一种面向对象的编程语言,优点是可移植性比较高,最初设计时就是本着一次编写到处执行设计的。可以开发各种应用程序和游戏,不过速度没有c++快,所以一般是不用java来编写应用程序和电脑游戏。
若相依 该用户已被删除
沙发
发表于 2015-1-21 10:42:00 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
山那边是海 该用户已被删除
板凳
发表于 2015-1-30 15:40:00 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
活着的死人 该用户已被删除
地板
发表于 2015-2-6 00:17:11 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
不帅 该用户已被删除
5#
发表于 2015-2-9 00:15:46 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
飘飘悠悠 该用户已被删除
6#
发表于 2015-2-25 21:32:07 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
小妖女 该用户已被删除
7#
发表于 2015-3-8 05:22:50 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
简单生活 该用户已被删除
8#
发表于 2015-3-10 12:46:23 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
深爱那片海 该用户已被删除
9#
发表于 2015-3-17 07:09:27 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
愤怒的大鸟 该用户已被删除
10#
发表于 2015-3-21 22:17:30 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
乐观 该用户已被删除
11#
发表于 2015-3-22 20:37:26 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
冷月葬花魂 该用户已被删除
12#
发表于 2015-3-22 22:51:42 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
老尸 该用户已被删除
13#
发表于 2015-3-22 23:00:10 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
再见西城 该用户已被删除
14#
发表于 2015-3-27 00:10:42 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
萌萌妈妈 该用户已被删除
15#
 楼主| 发表于 2015-3-27 11:08:47 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
海妖 该用户已被删除
16#
发表于 2015-4-3 04:46:10 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
若天明 该用户已被删除
17#
发表于 2015-4-7 14:26:16 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
因胸联盟 该用户已被删除
18#
发表于 2015-4-23 14:18:17 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
柔情似水 该用户已被删除
19#
发表于 2015-5-6 08:10:35 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
精灵巫婆 该用户已被删除
20#
发表于 2015-6-8 16:50:11 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-5 10:04

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表