我的环境,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发现该文件没有变。
有谁知道是怎么回事吗?

解决方案 »

  1.   

    java文件被改变了,那就应该重新编译源文件,class文件才会改变呀...
      

  2.   

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

  3.   


    哈哈,我的是一般工程,这样改好使了。web工程下没验证。
    writeFile()中的参数一定要严格按他说的格式写,我开始的时候写成了"/bin"、"//bin"、"/bin/"均不好使。