分手快乐 发表于 2015-1-18 11:29:30

JAVA网页编程之剖析JDK 7的静态范例言语撑持仓酷云

java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.Java假造机的字节码指令集的数目自从Sun公司的第一款Java假造机问世至JDK7光降之前的十余年工夫里,一向没有产生任何变更。跟着JDK7的公布,字节码指令集终究迎来了第一名新成员——invokedynamic指令。这条新增添的指令是JDK7完成“静态范例言语(DynamicallyTypedLanguage)”撑持而举行的改善之一,也是为JDK8能够顺遂完成Lambda表达式做手艺筹办。在这篇文章中,我们将往懂得JDK7这项新特征的呈现来龙去脉和它的意义。
静态范例言语

在先容JDK7供应的静态范例言语撑持之前,我们要先弄分明静态范例言语是甚么?它与Java言语、Java假造机有甚么干系?懂得JDK7供应静态范例言语撑持的手艺背景,对了解这个言语特征是很需要的。
何谓静态范例言语?静态范例言语的关头特性是它的范例反省的主体历程是在运转期而不是编译期举行的,满意这个特性的言语有良多,经常使用的包含:APL、Clojure、Erlang、Groovy、JavaScript、Jython、Lisp、Lua、PHP、Prolog、Python、Ruby、Smalltalk和Tcl等等。那绝对地,在编译期就举行范例反省历程的言语,如C++和Java等就是最经常使用的静态范例言语。
以为下面界说过于观点化?那我们无妨经由过程两个例子以最浅易的体例来讲明甚么是“在编译期/运转期举行”和甚么是“范例反省”。起首看这段复杂的Java代码,它是不是能一般编译和运转?
publicstaticvoidmain(String[]args){int[][][]array=newint[-1];}这段代码可以一般编译,但运转的时分会报NegativeArraySizeException非常。在《Java假造机标准》中明白划定了NegativeArraySizeException是一个运转时非常,普通一点说,运转时非常就是只需代码不运转到这一行就不会有成绩。与运转时非常绝对应的是毗连时非常,比方很罕见的NoClassDefFoundError便属于毗连时非常,即便会招致毗连时非常的代码放在一条没法实行到的分歧路径上,类加载时(Java的毗连历程不在编译阶段,而在类加载阶段)也还是会抛出非常。
不外,在C言语里,寄义不异的代码的代码就会在编译期报错:
intmain(void){inti[-1];//GCC回绝编译,报“sizeofarrayisnegative”return0;}由此看来,一门言语的哪种反省举动要在运转期举行,哪种反省要在编译期举行并没有一定的因果逻辑干系,关头是在言语标准中工资划定的,再举一个例子来注释“范例反省”,比方上面这一句再一般不外的代码:
obj.println(“helloworld”);明显,这行代码必要一个详细的高低文才有会商的意义,假定它在Java言语中,而且变量obj的范例为java.io.PrintStream,那obj的值就必需是PrintStream的子类(完成了PrintStream接口的类)才是正当的。不然,哪怕obj属于一个的确有效println(String)办法,但与PrintStream接口没有承继干系,代码仍然不克不及运转——由于范例反省分歧法。
可是不异的代码在ECMAScript(JavaScript)中情形则纷歧样,不管obj详细是何品种型,只需这类范例的界说中的确包括有println(String)办法,那办法挪用即可乐成。
这类不同发生的缘故原由是Java言语在编译时代却已将println(String)办法完全的标记援用(本例中为一项CONSTANT_InterfaceMethodref_info常量)天生出来,作为办法挪用指令的参数存储到Class文件中,比方上面这个模样:
invokevirtual#4;//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V这个标记援用包括了此办法界说在哪一个详细范例当中、办法的名字和参数按次、参数范例和办法前往值等信息,经由过程这个标记援用,假造机就能够翻译出这个办法的间接援用(比如办法内存地点大概其他完成情势)。而在ECMAScript等静态范例言语中,变量obj自己是没有范例的,变量obj的值才具有的范例,编译时分最多只能断定办法称号、参数、前往值这些信息,而不会往断定办法地点的详细范例(办法吸收者不流动)。“变量无范例而变量值才有范例”这个特性也是静态范例言语的一个主要特性。
懂得了静态和静态范例言语的区分后,大概读者的下一个成绩就是静态、静态范例言语二者谁更好,大概谁加倍先辈?这类对照不会有切实谜底,它们都有本人的长处,选择哪一种言语是必要衡量的事变。静态范例言语在编译期断定范例,最明显的优点是编译器能够供应松散的范例反省,如许与范例相干的成绩能在编码的时分就实时发明,利于不乱性及代码到达更年夜的范围。而静态范例言语在运转期断定范例,这能够为开辟职员供应更年夜的天真性,某些在静态范例言语中要花大批痴肥代码来完成的功效,由静态范例言语来完成大概会很明晰简便,明晰简便一般也就意味着开辟效力的提拔。
别的,静态、静态范例言语的界线并不是泾渭明白,如C#是一门静态范例言语,可是在.NET4.0中新增添的dynamic关头字(它感化就是用来形貌一个“无范例”的变量)和响应的DLR撑持后,C#4.0便具有了静态言语的特征。
JDK7与静态范例

如今,我们回到本专栏的主题,来看看Java言语、假造机与静态范例言语之间有甚么干系。Java假造机毫无疑问是Java言语的运转平台,但它的任务其实不仅限于此,早在1997年出书的《Java假造机标准》初版中就计划了如许一个愿景:“在将来,我们会对Java假造机举行得当的扩大,以便更好的撑持其他言语运转于Java假造机之上”。而今朝的确已有很多静态范例言语运转于Java假造机之上了,如Clojure、Groovy、Jython和JRuby等等,可以在统一个假造机之上能够完成静态范例言语的松散与静态范例言语的天真,这是一件很美好的事变。
但遗憾的是Java假造机层面临静态范例言语的撑持一向都有所完善,次要体现在办法挪用方面:JDK7之前字节码指令会合,四条办法挪用指令(invokevirtual、invokespecial、invokestatic、invokeinterface)的第一个参数都是被挪用的办法的标记援用(CONSTANT_Methodref_info大概CONSTANT_InterfaceMethodref_info常量),后面已提到过,办法的标记援用在编译时发生,而静态范例言语只要在运转期才干断定吸收者范例。如许,在Java假造机上完成的静态范例言语就不能不利用“曲线救国”的体例(如编译时留个占位符范例,运转时静态天生字节码完成详细范例到占位符范例的适配)来完成,如许必将让静态范例言语完成的庞大度增添,也大概带来分外的功能大概内存开支。只管能够想一些举措(如CallSiteCaching)让这些开支只管变小,但这类底层成绩终回是应该在假造机条理上往办理才最符合,因而在Java假造机层面上供应静态范例的间接撑持就成了Java平台的开展趋向之一,这就是JDK7(JSR-292)中invokedynamic指令和java.lang.invoke包呈现的手艺背景。
java.lang.invoke包

JDK7完成了JSR292《SupportingDynamicallyTypedLanguagesontheJavaPlatform》,新到场的java.lang.invoke包是就是JSR292的一个主要构成部分,这个包的次要目标是在之前纯真依托标记援用来断定挪用的方针办法这条路以外,供应一种新的静态断定方针办法的机制,称为MethodHandle。这个表达也欠好懂?那无妨把MethodHandle与C/C++中的FunctionPointer,大概C#内里的Delegate类比一下。举个例子,假如我们要完成一个带谓词的排序函数,在C/C++中经常使用做法是把谓词界说为函数,用函数指针来把谓词传送到排序办法,像如许:
voidsort(intlist[],constintsize,int(*compare)(int,int))但Java言语中做不到这一点,没有举措独自把一个函数作为参数举行传送。广泛的做法是计划一个带有compare()办法的Comparator接口,以完成了这个接口的对象作为参数,比方Collections.sort()就是如许界说的:
voidsort(Listlist,Comparatorc)不外,在具有MethodHandle以后,Java言语也能够具有相似于函数指针大概托付的办法别号的工具了。上面代码演示了MethodHandle的基础用处,不管obj是何品种型(一时界说的ClassA抑或是完成PrintStream接口的完成类System.out),都能够准确挪用到println()办法。
importstaticjava.lang.invoke.MethodHandles.lookup;importjava.lang.invoke.MethodHandle;importjava.lang.invoke.MethodType;/***JSR292MethodHandle基本用法演示*@authorIcyFenix*/publicclassMethodHandleTest{staticclassClassA{publicvoidprintln(Strings){System.out.println(s);}}publicstaticvoidmain(String[]args)throwsThrowable{Objectobj=System.currentTimeMillis()%2==0?System.out:newClassA();//不管obj终极是哪一个完成类,上面这句都能准确挪用到println办法。getPrintlnMH(obj).invokeExact("icyfenix");}privatestaticMethodHandlegetPrintlnMH(Objectreveiver)throwsThrowable{//MethodType:代表“办法范例”,包括了办法的前往值(methodType()的第一个参数)和详细参数(methodType()第二个及今后的参数)。MethodTypemt=MethodType.methodType(void.class,String.class);//lookup()办法来自于MethodHandles.lookup,这句的感化是在指定类中查找切合给定的办法称号、办法范例,而且切合挪用权限的办法句柄。//由于这里挪用的是一个虚办法,依照Java言语的划定规矩,办法第一个参数是隐式的,代表该办法的吸收者,也便是this指向的对象,这个参数之前是放在参数列表中举行传送,如今供应了bindTo()办法来完成这件事变。returnlookup().findVirtual(reveiver.getClass(),"println",mt).bindTo(reveiver);}}办法getPrintlnMH()中实践上是摹拟了invokevirtual指令的实行历程,只不外它的分拨逻辑并不是固化在Class文件的字节码上的,而是经由过程一个详细办法来完成。而这个办法自己的前往值(MethodHandle对象),能够视为对终极挪用办法的一个“援用”。以此为基本,有了MethodHandle就能够写出相似于如许的函数声了然:
voidsort(Listlist,MethodHandlecompare)从下面的例子看来,利用MethodHandle并没有几坚苦,不外看完它的用法以后,读者也许就会疑问到,不异的事变,用反射不是早就能够完成了吗?
的确,仅站在Java言语的角度看,MethodHandle的利用办法和效果上与Reflection都有浩瀚类似的地方。不外,它们也有以下这些区分:


[*]Reflection和MethodHandle机制实质上都是在摹拟办法挪用,可是Reflection是在摹拟Java代码条理的办法挪用,而MethodHandle是在摹拟字节码条理的办法挪用。在MethodHandles.Lookup上的三个办法findStatic()、findVirtual()、findSpecial()恰是为了对应于invokestatic、invokevirtual&invokeinterface和invokespecial这几条字节码指令的实行权限校验举动,而这些底层细节在利用ReflectionAPI时是不必要体贴的。
[*]Reflection中的java.lang.reflect.Method对象远比MethodHandle机制中的java.lang.invoke.MethodHandle对象所包括的信息来很多。前者是办法在Java一真个周全映像,包括了办法的署名、形貌符和办法属性表中各类属性的Java端暗示体例,还包括有实行权限等的运转期信息。尔后者仅仅包括着与实行该办法相干的信息。用开辟职员普通的话来说,Reflection是分量级,而MethodHandle是轻量级。
[*]因为MethodHandle是对字节码的办法指令挪用的摹拟,那实际上假造机在这方面做的各类优化(如办法内联),在MethodHandle上也应该能够接纳相似思绪往撑持(但今朝完成还不完美)。而经由过程反射往挪用办法则不可。
MethodHandle与Reflection除下面枚举的区分外,最关头的一点还在于往失落后面会商施加的条件“仅站在Java言语的角度看”以后:ReflectionAPI的计划方针是只为Java言语服务的,而MethodHandle则计划为可服务于一切Java假造机之上的言语,个中也包含了Java言语罢了。
invokedynamic指令

本文一入手下手就提到了JDK7为了更好地撑持静态范例言语,引进了第五条办法挪用的字节码指令invokedynamic,但后面一向没有再提到它,乃至把之前利用MethodHandle的示例代码反编译后也不会瞥见invokedynamic的身影,它究竟有甚么使用呢?
某种水平上能够说invokedynamic指令与MethodHandle机制的感化是一样的,都是为懂得决原有四条invoke*指令办法分拨划定规矩固化在假造机当中的成绩,把怎样查找方针办法的决意权从假造机转嫁到详细用户代码当中,让用户(包括其他言语的计划者)有更高的自在度。并且,它们二者的思绪也是可类比的,能够设想作为了告竣统一个目标,一个用下层代码和API来完成,另外一个是用字节码和Class中其他属性和常量来完成。因而,假如后面MethodHandle的例子看懂了,了解invokedynamic指令其实不坚苦。
每处含有invokedynamic指令的地位都被称作“静态挪用点(DynamicCallSite)”,这条指令的第一个参数不再是代表办法标记援用的CONSTANT_Methodref_info常量,而是变成JDK7新到场的CONSTANT_InvokeDynamic_info常量,从这个新常量中能够失掉3项信息:引诱办法(BootstrapMethod,此办法寄存在新增的BootstrapMethods属性中)、办法范例(MethodType)和称号。引诱办法是有流动的参数,而且前往值是java.lang.invoke.CallSite对象,这个代表真正要实行的方针办法挪用。依据CONSTANT_InvokeDynamic_info常量中供应的信息,假造机能够找到而且实行引诱办法,从而取得一个CallSite对象,终极挪用要实行的方针办法上。我们仍是按例拿一个实践例子来注释这个历程吧。以下面代码清单所示:
importstaticjava.lang.invoke.MethodHandles.lookup;importjava.lang.invoke.CallSite;importjava.lang.invoke.ConstantCallSite;importjava.lang.invoke.MethodHandle;importjava.lang.invoke.MethodHandles;importjava.lang.invoke.MethodType;publicclassInvokeDynamicTest{publicstaticvoidmain(String[]args)throwsThrowable{INDY_BootstrapMethod().invokeExact("icyfenix");}publicstaticvoidtestMethod(Strings){System.out.println("helloString:"+s);}publicstaticCallSiteBootstrapMethod(MethodHandles.Lookuplookup,Stringname,MethodTypemt)throwsThrowable{returnnewConstantCallSite(lookup.findStatic(InvokeDynamicTest.class,name,mt));}privatestaticMethodTypeMT_BootstrapMethod(){returnMethodType.fromMethodDescriptorString("(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;",null);}privatestaticMethodHandleMH_BootstrapMethod()throwsThrowable{returnlookup().findStatic(InvokeDynamicTest.class,"BootstrapMethod",MT_BootstrapMethod());}privatestaticMethodHandleINDY_BootstrapMethod()throwsThrowable{CallSitecs=(CallSite)MH_BootstrapMethod().invokeWithArguments(lookup(),"testMethod",MethodType.fromMethodDescriptorString("(Ljava/lang/String;)V",null));returncs.dynamicInvoker();}}这段代码与后面MethodHandleTest的感化基础上是一样的,固然笔者没有加以正文,可是浏览起来应该不坚苦。真没读懂也没关系,我没写正文的缘故原由是这段代码并不是写给人看的(@_@,我不是在骂人)。因为今朝光靠Java言语的编译器javac没有举措天生带有invokedynamic指令的字节码(已经有一个java.dyn.InvokeDynamic的语法糖能够完成,但厥后被作废了),以是只能用一些变通的举措,JohnRose(DaVinciMachineProject的Leader)编写了一个把程序的字节码转换为利用invokedynamic的复杂工具INDY来完成这件事变,我们要利用这个工具来发生终极要的字节码,因而这个示例代码中的办法称号不克不及乱改,更不克不及把几个办法兼并到一同写。
把下面代码编译、转换后从头天生的字节码以下(了局利用javap输入,因版面缘故原由,精简了很多有关的内容):
Constantpool:#121=NameAndType#33:#30//testMethod:(Ljava/lang/String;)V#123=InvokeDynamic#0:#121//#0:testMethod:(Ljava/lang/String;)Vpublicstaticvoidmain(java.lang.String[])throwsjava.lang.Throwable;Code:stack=2,locals=1,args_size=10:ldc#23//Stringabc2:invokedynamic#123,0//InvokeDynamic#0:testMethod:(Ljava/lang/String;)V7:nop8:returnpublicstaticjava.lang.invoke.CallSiteBootstrapMethod(java.lang.invoke.MethodHandles$Lookup,java.lang.String,java.lang.invoke.MethodType)throwsjava.lang.Throwable;Code:stack=6,locals=3,args_size=30:new#63//classjava/lang/invoke/ConstantCallSite3:dup4:aload_05:ldc#1//classorg/fenixsoft/InvokeDynamicTest7:aload_18:aload_29:invokevirtual#65//Methodjava/lang/invoke/MethodHandles$Lookup.findStatic:(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;12:invokespecial#71//Methodjava/lang/invoke/ConstantCallSite."<init>":(Ljava/lang/invoke/MethodHandle;)V15:areturn从main()办法的字节码中可见,底本的办法挪用指令已被交换为invokedynamic了,它的参数为第123项常量(第二个值为0的参数在HotSpot顶用不到,与invokeinterface谁人的值为0的参数一样是占位的):
intmain(void){inti[-1];//GCC回绝编译,报“sizeofarrayisnegative”return0;}0从常量池中可见,第123项常量显现“#123=InvokeDynamic#0:#121”申明它是一项CONSTANT_InvokeDynamic_info范例常量,常量值中后面“#0”代表引诱办法取BootstrapMethods属性表的第0项(javap没有列出属性表的详细内容,不外示例中唯一一个引诱办法,即BootstrapMethod()),尔后面的“#121”代表援用第121项范例为CONSTANT_NameAndType_info的常量,从个常量中能够猎取办法称号和形貌符,既前面输入的“testMethod:(Ljava/lang/String;)V”。
再看BootstrapMethod(),这个办法Java源码中没有,是INDY发生的,可是它的字节码很简单读懂,一切逻辑就是挪用MethodHandles$Lookup的findStatic()办法,发生testMethod()办法的MethodHandle,然后用它创立一个ConstantCallSite对象。最初,这个对象前往给invokedynamic指令完成对testMethod()办法的挪用,invokedynamic指令的挪用历程到此就宣布完成了。
参考材料



[*]http://java.sun.com/developer/technicalArticles/DynTypeLang/
[*]http://www.iteye.com/topic/477934
[*]https://wikis.oracle.com/display/mlvm/InterfaceDynamic#InterfaceDynamic-2.dynamicinvocation
这里特指数目上没有变更。后面有大批指令的语义、格局产生过变更,比方invokespecial指令,也有大批指令在JDK7中被禁用失落,比方jsr、jsr_w指令。
静态范例言语与静态言语、弱范例言语并非一个观点,必要区分看待。
这个包在不算短的工夫里的称号是java.dyn,也已经长久改名为java.lang.mh,假如读者在其他材料上看到这两个包名能够把它们与java.lang.invoke了解为统一样工具。
INDY:http://blogs.oracle.com/jrose/entry/a_modest_tool_for_writing。
本文源代码可在这里下载。

java主要分三块,j2se:java的基础核心语言。j2me:java的微型模块,专门针对内存小,没有持续电源等小型设备。j2ee:java的企业模块,专门针对企业数据库服务器的连接维护。

只想知道 发表于 2015-1-21 07:50:34

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

谁可相欹 发表于 2015-1-25 21:42:30

是一种使用者不需花费很多时间学习的语言

仓酷云 发表于 2015-2-4 03:02:18

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

精灵巫婆 发表于 2015-2-5 20:22:14

是一种使用者不需花费很多时间学习的语言

金色的骷髅 发表于 2015-2-12 17:10:19

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

深爱那片海 发表于 2015-2-17 08:31:07

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

灵魂腐蚀 发表于 2015-2-23 10:35:31

是一种语言,用以产生「小应用程序(Applet(s))

爱飞 发表于 2015-3-6 00:28:22

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

变相怪杰 发表于 2015-3-12 08:05:33

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

简单生活 发表于 2015-3-15 05:29:14

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

蒙在股里 发表于 2015-3-18 22:03:39

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

乐观 发表于 2015-3-26 16:05:54

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

再见西城 发表于 2015-4-1 16:09:56

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

飘灵儿 发表于 2015-4-6 10:48:21

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

兰色精灵 发表于 2015-4-7 21:15:29

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。

小妖女 发表于 2015-4-10 06:21:56

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

飘飘悠悠 发表于 2015-4-19 11:53:52

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

再现理想 发表于 2015-4-20 21:20:39

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

愤怒的大鸟 发表于 2015-6-5 09:15:36

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
页: [1] 2
查看完整版本: JAVA网页编程之剖析JDK 7的静态范例言语撑持仓酷云