仓酷云

标题: JAVA网页编程之java中的字节码 [打印本页]

作者: 莫相离    时间: 2015-1-18 11:44
标题: JAVA网页编程之java中的字节码
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。这段工夫一向在看java,看到讲Reflection,ClassLoader,javassist的中央,很镇静,由于之前用.net的时分打仗过一点点Reflection,但我再看到ClassLoader的时分,几乎以为十分奇妙,但是奇妙的工具一样平常都很难明,看了良多材料,都不太分明,直到在ibm的网站上看到《java编程的静态性》,很具体的论述了ClassLoader的感化,接着我看了利用javassist修正字节码的中央,伎痒,下手做了一个小小的例子,伴侣说我迷途知返,方才打仗java就看这个工具,呵呵,未几说,看看代码就晓得了。


AddMethod.java

/*
*Createdon2004-9-24
*
*TODOTochangethetemplateforthisgeneratedfilegoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/
packagecn.cpX.Parco.AddMethod;
importjava.lang.reflect.*;
importjavassist.*;
/**
*@authorcpX.Parco
*
*TODOTochangethetemplateforthisgeneratedtypecommentgoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/
publicclassAddMethod{
/**
*
*/
publicAddMethod(){
super();
//TODOAuto-generatedconstructorstub
}
privatestaticvoidaddMethod(CtClassclas)
{
try
{
StringstrOldMethod="outputHello";
StringstrNewMethod=strOldMethod+"2";

/*//addnewMethod(copy)
*StringBuffernewMethodBody=newStringBuffer();
*CtMethodoldMethod=clas.getDeclaredMethod(strOldMethod);
*CtMethodnewMethod=CtNewMethod.copy(oldMethod,strNewMethod,clas,null);
*newMethodBody.append("{System.out.println("Hello");}");
*newMethod.setBody(newMethodBody.toString());
*clas.addMethod(newMethod);
*/
//addnewMethod(create)
CtClass[]arrClas=newCtClass[0];
CtClass[]arrExce=newCtClass[0];
StringBuffernewMethodBody=newStringBuffer();
newMethodBody.append("{System.out.println("Hello");}");
CtMethodnewMethod=CtNewMethod.make(CtClass.voidType,strNewMethod,arrClas,arrExce,newMethodBody.toString(),clas);
clas.addMethod(newMethod);
//invokenewMethod
ClasstmpClass=clas.toClass();
Objectobj=tmpClass.newInstance();
Methodmethod=tmpClass.getDeclaredMethod(strNewMethod,null);
method.invoke(obj,null);
}
catch(Exceptione)
{
e.printStackTrace();
}

}
publicstaticvoidmain(String[]args){
try
{
CtClassclas=ClassPool.getDefault().get("cn.cpX.Parco.AddMethod.SayHello");
addMethod(clas);
}
catch(NotFoundExceptione)
{
e.printStackTrace();
}
}
}



SayHello.java

/*
*Createdon2004-9-24
*
*TODOTochangethetemplateforthisgeneratedfilegoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/
packagecn.cpX.Parco.AddMethod;
/**
*@authorcpX.Parco
*
*TODOTochangethetemplateforthisgeneratedtypecommentgoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/
publicclassSayHello{
/**
*
*/
publicSayHello(){
super();
//TODOAuto-generatedconstructorstub
}
publicvoidoutputHello()
{

}
}


一入手下手的时分由于不晓得用谁人make办法,以是在SayHello内里放了一个空的outputHello,目标就是天生新的CtMethod时分利用的,查过文档后利用了make办法,利用make办法,能够不必依托之前的outputHello办法,写得过程当中,由于C++的影响,我把新的method的参数列表用了一个包括一个void.class的数组取代,了局不克不及经由过程编译,另有非常列表,是一个CtClass的数组,不克不及间接把Exception放出来,估量必要承继一下CtClass。这两个中央我已经都用null做参数实验过,但是都不克不及一般运转,可见java中的空数组和null是有很年夜区分的。字节码的修正另有良多办法和感化,人人能够一同研讨一下。

首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。
作者: 海妖    时间: 2015-1-21 13:39
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 谁可相欹    时间: 2015-1-28 05:33
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 仓酷云    时间: 2015-1-30 09:29
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 金色的骷髅    时间: 2015-2-6 09:40
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 柔情似水    时间: 2015-2-10 08:17
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 小女巫    时间: 2015-2-11 05:19
是一种将安全性(Security)列为第一优先考虑的语言
作者: 活着的死人    时间: 2015-3-1 21:37
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者: 精灵巫婆    时间: 2015-3-2 11:54
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 不帅    时间: 2015-3-3 20:24
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者: 若天明    时间: 2015-3-11 13:07
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者: 分手快乐    时间: 2015-3-16 17:35
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 只想知道    时间: 2015-3-22 23:27
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 若相依    时间: 2015-3-27 23:01
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 爱飞    时间: 2015-4-4 02:20
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 冷月葬花魂    时间: 2015-4-6 00:10
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 愤怒的大鸟    时间: 2015-4-14 11:54
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 再现理想    时间: 2015-4-21 07:48
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
作者: 小妖女    时间: 2015-5-1 07:10
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 蒙在股里    时间: 2015-5-1 19:10
是一种使网页(Web Page)产生生动活泼画面的语言




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2