快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

java中的字节码

这段时间一直在看java,看到讲 Reflection,ClassLoader,javassist 的地方,很高兴,因为以前用.net的时候接触过一点点Reflection,但我再看到ClassLoader的时候,简直觉得异常神奇,可是神奇的东西一般都很难懂,看了很多资料,都不太明白,直到在ibm的网站上看到《java编程的动态性》,很具体的阐述了ClassLoader的作用,接着我看了使用javassist修改字节码的地方,跃跃欲试,动手做了一个小小的例子,朋友说我误入歧途,刚刚接触java就看这个东西,呵呵,不多说,看看代码就知道了。


AddMethod.java

/*
* Created on 2004-9-24
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package cn.cpX.Parco.AddMethod;
import java.lang.reflect.*;
import javassist.*;
/**
* @author cpX.Parco
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class AddMethod {
/**
*
*/
public AddMethod() {
super();
// TODO Auto-generated constructor stub
}
private static void addMethod(CtClass clas)
{
try
{
String strOldMethod = "outputHello";
String strNewMethod = strOldMethod + "2";

/* //add new Method (copy)
* StringBuffer newMethodBody = new StringBuffer();
* CtMethod oldMethod = clas.getDeclaredMethod(strOldMethod);
* CtMethod newMethod = CtNewMethod.copy(oldMethod, strNewMethod, clas, null);
* newMethodBody.append("{System.out.println(/"Hello/");}");
* newMethod.setBody(newMethodBody.toString());
* clas.addMethod(newMethod);
*/
//add new Method (create)
CtClass []arrClas = new CtClass[0];
CtClass []arrExce = new CtClass[0];
StringBuffer newMethodBody = new StringBuffer();
newMethodBody.append("{System.out.println(/"Hello/");}");
CtMethod newMethod = CtNewMethod.make(CtClass.voidType ,strNewMethod, arrClas, arrExce, newMethodBody.toString(), clas);
clas.addMethod(newMethod);
//invoke new Method
Class tmpClass = clas.toClass();
Object obj = tmpClass.newInstance();
Method method = tmpClass.getDeclaredMethod(strNewMethod, null);
method.invoke(obj, null);
}
catch(Exception e)
{
e.printStackTrace();
}

}
public static void main(String[] args) {
try
{
CtClass clas = ClassPool.getDefault().get("cn.cpX.Parco.AddMethod.SayHello");
addMethod(clas);
}
catch(NotFoundException e)
{
e.printStackTrace();
}
}
}



SayHello.java

/*
* Created on 2004-9-24
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package cn.cpX.Parco.AddMethod;
/**
* @author cpX.Parco
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class SayHello {
/**
*
*/
public SayHello() {
super();
// TODO Auto-generated constructor stub
}
public void outputHello()
{

}
}


一开始的时候因为不知道用那个make方式,所以在SayHello里面放了一个空的outputHello,目的就是生成新的CtMethod时候使用的,查过文档后使用了make方式,使用make方式,可以不用依赖以前的outputHello方式,写得过程中,因为C++的影响,我把新的method的参数列表用了一个包含一个void.class的数组代替,结果不能通过编译,还有非常列表,是一个CtClass的数组,不能直接把Exception放进去,估计需要继续一下CtClass。这两个地方我曾经都用null做参数尝试过,可是都不能正常运行,可见java中的空数组和null是有很大区别的。字节码的修改还有很多方式和作用,大家可以一起研究一下。




返回类别: 教程
上一教程: 自己动手编写Eclipse扩展点
下一教程: Java数据报编程之组播

您可以阅读与"java中的字节码"相关的教程:
· java中的基于套结字(socket)的通信 一. 一个双人单方向通信例子
· JAVA SOCKET编程中的一个秘密类
· Java 面试中的陷阱
· Java中的Sizeof(二)
· java 面试中的一道编写一个截取字符串的函数!!!!
    微笑服务 优质保证 索取样品