|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在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这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。 |
|