分手快乐 发表于 2015-1-18 11:15:56

JAVA网页编程之利用Byte Buddy天生Java字节码仓酷云

J2ME在手机游戏开发的作用也是无用质疑的。至于桌面程序,可能有人说java不行,界面不好看,但是请看看net网页编程Beans和Eclipse吧,他们都是利用java开发的,而他们的界面是多么的华丽,所以界面决不是java的缺点。还有一个不得不提的优点就是大多java人员都挂在嘴边的java的跨平台性,目前这确实也是java优点之一。上周我们探究了下Java的强范例及静态范例体系。我供认如许的范例让我们的代码表达性更强,可是同时也限定了第三方库供应面向POJO的API的才能。
我们分明了Java的反射切实其实是一种和用户代码交互的不错体例,可是如许丧失了范例平安的优点。为了完成范例平安,也许更好的体例就是在运转时经由过程代码天生来创立指定用户类的子类?关于这些类,我们会重写它们的办法以完成我们的框架逻辑,而不必要用户依附于框架的范例。
我倡议你读下这篇文章的第一部分,假如你还没读过的话。我但愿它能让你分明代码天生想要办理的是哪类成绩,和甚么时分用反射的话会更符合一些。
能够入手下手了吗

我们都晓得怎样往界说一个Java类(我但愿云云),因而这里也没有甚么新的工具可讲了。但是一样平常我们都是经由过程某种JVM言语来表述这些类的界说,然后才哀求编译器往把我们的工具翻译成字节码。
Java字节码是一个二进制格局,可是,不止云云,Java编程言语和它对应的字节码十分类似。这也不奇异,由于Java言语某种水平上也驱动着字节码指令集的演进。假如你想懂得更多关于字节码的常识,能够参考下RebelLabs上的这篇<ahref="http://zeroturnaround.com/rebellabs/rebel-labs-report-mastering-java-bytecode-at-the-core-of-the-jvm/"target="blank">把握JVM字节码_的不错的分享,它会告知你内里的良多技能。
固然间接操纵字节码可让你完整掌控类的天生历程,不外它切实其实很难弄定。字节码并没有给你供应像主动装箱大概高层面的把持流程之类的便当性。一样的,天生字节码必要你做很多烦琐的事情好比盘算操纵数栈的巨细和盘算栈帧。假如能够跳过这些,只存眷于你要天生的运转时期码不是更好吗?
固然云云。也正因为这个缘故原由,即使是Java类库也自带了一些无限的撑持。这些类又被称为JDK代办署理,它能够在运转时天生完成了某组接口的某个类的界说。
挪用内里任何一个接口的办法城市被重定向到一个挪用handler内里,你得往完成并供应这个handler。提及JDK代办署理,它依附于接口的完成。你不克不及用这些Java代办署理来扩大现有的类。
关于我们上篇博客中的谁人平安框架而言,这意味着我们只能确保接口办法的平安,而不克不及是其余范例的办法。这个限定真是弱爆了。恰是由于这个,在JDK代办署理呈现了以后,很快cglib就作为一个自力的库公布了。
cglib的事情道理与JDK代办署理相似,可是它能够静态天生子类而不止是完成接口,因而它能够代办署理任何办法。cglib至今仍十分盛行,像Spring如许的框架也依附于它来完成某些功效。
但是,只管它十分盛行,cglib这些年的开辟已不那末活泼了,乃至bug修复也只是偶然才公布一次。因为CGLIB不再撑持Java8的默许办法等新特征,这个成绩就变得相称严峻了。
因为cglib这些未办理的成绩,这些年愈来愈多的工程入手下手选择移除这个库。最少在Hiberate将javassist作为首选以后,这个Java帮助(javassist:javaassistant)库分明成了支流的选择。
javassist有一个和cglib功效十分相似的一个代码库。除此以外,它还供应了一个运转时的Java编译器,这使得你能够经由过程供应文本的Java代码来举行任何Java类的界说及重界说。
这听起来十分酷,在一个字符串中写代码就能够疾速地办理成绩,特别是你必要将一个已编译的功效和一个静态功效举行混进的时分。下图中的代码是一个利用javassist的实在例子。



更主要的是,只管Java源码是表达Java类的一个不错的体例,不幸的是,只管RedHat已入手下手援助这个库了,但迄今为止javassist仍旧只能算是一个团体的项目。跟着Java言语的精益求精,javassist的编译器渐渐也入手下手掉队于JDK的版本了。
因而,只管能够用javassist来写Java代码,你仍是得思索一下字节码。并且这也是必需的,好比说,举行基本范例的显式装箱。猜猜为何?这是由于因为Java8新的言语特征的引进,两个编译器间的差异变得愈来愈年夜了。
少埋怨一点好吧?

你很简单就可以指出他人写的库中存在的成绩,可是我们能够改良这类情形吗?cglib和javassist都是本世纪早期的时分创建的,它们供应的API是环绕着Java在这段时代供应的言语特征来计划的。
这些库的参与以后一个明显的立异就是注解。这几有点好笑,代码天生次要就是用于完成基于注解的API,可是竟然没有一个库是内建了这个功效的。因为这个缘故原由,我承受了这个应战,本人写了另外一个库来完成这个功效。
这个库叫做bytebuddy,它利用注解和一个范畴特定的言语来完成它的方针。你能够像上面这段代码那样创立一个运转时类:
newByteBuddy().subclass(Object.class).method(named(“toString”)).intercept(MethodDelegation.to(ToStringInterception.class)).make()假如你能读懂这段代码的寄义,那末这个库就已到达我的预期了。另有一个对照奥秘的一点也许就是办法拦阻了,它承受一个办法代办署理作为参数。当承受到如许一个办法代办署理的时分,ByteBuddy会将办法挪用重定向到指定类中婚配给命名字的一个静态办法里。方针类和办法能够完成以下:
classToStringInterception{publicstaticStringintercept(@ContextClass<?>type){returntype.getSimpleName();}}有了上述的这个拦阻器,这个静态类上任何toString办法的挪用都能够托付给这个静态办法。经由过程利用了@Context注解,这个办法承受一个类援用作为它的独一参数。因而,运转时toString的前往值就是这个被拦阻类的名字。
这只是ByteBuddyAPI的一只外相工夫,这里我们其实不想深切这个库的细节。假如你感乐趣的话,能够参数下它的官网文档,下面有具体的申明。
不论怎样说,为了演示下这个库十分合用于一样平常的编程事情,我们来用ByteBuddy完成我们在文章后面所提到的谁人平安库。正如你所看到的,这个完成只是复杂的将登任命户存储在了一个静态字段中,它只需几行代码就可以完成:

从一个编程语言的普及程度来将,一个好的IDE是至关中要的,而现在的java的IDE虽然已经很好了,但是和.net网页编程比起来还是稍微差一些的,这是个客观事实。java要想普及的更好。DE是必须加以改进的。

再现理想 发表于 2015-1-20 18:52:00

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

兰色精灵 发表于 2015-1-20 18:52:00

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

再见西城 发表于 2015-1-25 11:32:39

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

乐观 发表于 2015-1-28 07:50:15

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

飘飘悠悠 发表于 2015-2-5 12:37:34

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

愤怒的大鸟 发表于 2015-2-7 01:32:30

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

精灵巫婆 发表于 2015-2-11 11:19:18

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

柔情似水 发表于 2015-3-5 00:03:22

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

因胸联盟 发表于 2015-3-6 13:52:49

是一种为 Internet发展的计算机语言

简单生活 发表于 2015-3-7 08:09:40

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

小女巫 发表于 2015-3-9 20:38:17

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

若相依 发表于 2015-3-17 00:54:02

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

谁可相欹 发表于 2015-3-23 10:16:07

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
页: [1]
查看完整版本: JAVA网页编程之利用Byte Buddy天生Java字节码仓酷云