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