javassist没有改变.class文件

程序员猪佩琪 2009-07-31 04:09:43
我的环境,eclipse+jdk1.5
原代码:
Human类
package com.hundsun.ares.liuji.myfirst;

public class Human {

private String name;
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("hello");
}

public String getName() {
return name;
}

public int doExam() {
return 5;
}
}

修改Human.class的java类

/**
* 为Human类加一个方法think,并更改doExam方法
* @author liuji
*
*/
public class CMethodHuman {

/**
* @param args
*/
public static void main(String[] args) throws Exception {
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("com.hundsun.ares.liuji.myfirst.Human");
//改变Human类里的doExam方法
CtMethod m = cc.getDeclaredMethod("doExam");
m.setBody("{System.out.println(\"shit\"); return 0;}");
m.insertBefore("System.out.println(\"fuck\");");
m.insertAfter("System.out.println(\"method doExam over\");");

//构建一个新方法
CtMethod newMethod = CtNewMethod.make("public Integer think(Integer num){return num;}", cc);
cc.addMethod(newMethod);
cc.writeFile();

//调用doExam方法
//Class c = Class.forName("com.hundsun.ares.liuji.myfirst.Human"); 不行
/*Class c = cc.toClass();
Object h = c.newInstance();
Method doExam = c.getDeclaredMethod("doExam", null);
System.out.println(doExam.invoke(h, null).toString());

//调用新方法
Method think = c.getDeclaredMethod("think", Class.forName("java.lang.Integer"));
System.out.print(think.invoke(h, new Integer(10)).toString());
*/
}


但是我用反编译工具jd查看Human.class发现该文件没有变。
有谁知道是怎么回事吗?
...全文
133 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jerry_liu20080504 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuwenjie517333813 的回复:]

引用 2 楼 cailiuhyi 的回复:
问题是出在:cc.writeFile(); 要指明路径
如果是一般的工程,cc.writeFile("bin/");就可以了
web工程下 cc.writeFile(classpath+"WEB-INF/classes")

先看看
[/Quote]

哈哈,我的是一般工程,这样改好使了。web工程下没验证。
writeFile()中的参数一定要严格按他说的格式写,我开始的时候写成了"/bin"、"//bin"、"/bin/"均不好使。
Jerry_liu20080504 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuwenjie517333813 的回复:]

引用 2 楼 cailiuhyi 的回复:
问题是出在:cc.writeFile(); 要指明路径
如果是一般的工程,cc.writeFile("bin/");就可以了
web工程下 cc.writeFile(classpath+"WEB-INF/classes")

先看看
[/Quote]

貌似也不好使啊
cailiuhyi 2009-08-02
  • 打赏
  • 举报
回复
问题是出在:cc.writeFile(); 要指明路径
如果是一般的工程,cc.writeFile("bin/");就可以了
web工程下 cc.writeFile(classpath+"WEB-INF/classes")
程序员猪佩琪 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cailiuhyi 的回复:]
问题是出在:cc.writeFile(); 要指明路径
如果是一般的工程,cc.writeFile("bin/");就可以了
web工程下 cc.writeFile(classpath+"WEB-INF/classes")
[/Quote]
先看看
Betterjava 2009-07-31
  • 打赏
  • 举报
回复
java文件被改变了,那就应该重新编译源文件,class文件才会改变呀...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧