package com.liming.javassist;
import javassist.*;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
public class JavaTest02 {
public static void main(String[] args) {
ClassPool cp = ClassPool.getDefault();
CtClass cc = null;
try {
cc = cp.makeClass("com.liming.javassist.DT");
CtMethod cm = CtMethod.make("public static void test2();",cc);
cm.setBody("{System.out.println(\"这只是一个测试类的方法2\");}");
cc.addMethod(cm);
CtMethod cm2 = CtNewMethod.make("public static void test3();",cc);
cm2.setBody("{System.out.println(\"CtNewMethod\");}");
cc.addMethod(cm2);
CtMethod cm3 = new CtMethod(cp.get(String.class.getName()),"test4",new CtClass[]{CtClass.intType,cp.get(String.class.getName())},cc);
cm3.setBody("{System.out.println($1+$2);return $1+$2;}");
cm3.setModifiers(Modifier.PRIVATE);
cc.addMethod(cm3);
CtField cf1 = CtField.make("private int age;",cc);
CtField cf2 = CtField.make("private String name;",cc);
cc.addField(cf1);
cc.addField(cf2);
CtField cf3 = cc.getDeclaredField("age");
cf3.setName("ages");
cf3.setModifiers(Modifier.PROTECTED);
CtConstructor cctr = new CtConstructor(new CtClass[]{CtClass.intType,cp.get("java.lang.String")},cc);
cctr.setBody("{this.ages = $1;this.name = $2;}");
cc.addConstructor(cctr);
CtMethod cm4 = CtNewMethod.make("public String test5(){return this.name+this.ages;}",cc);
cc.addMethod(cm4);
CtMethod cm5 = cc.getDeclaredMethod("test5",null);
cm5.insertAfter("System.out.println(\"道不可言,言而非也\");");
cm5.insertBefore("System.out.println(\"采菊东篱下,悠然见南山\");");
CtMethod cm6 = CtNewMethod.getter("getName",cf2);
cc.addMethod(cm6);
cc.writeFile();
Class xc = cc.toClass();
Constructor<?> co = xc.getConstructor(int.class,String.class);
Object o = co.newInstance(101,"黄大仙");
Method m = xc.getMethod("test5");
System.out.println(m.invoke(o));
} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public static void main1(String[] args) {
ClassPool cp = ClassPool.getDefault();
CtClass cc = null;
try {
cc = cp.get("com.liming.javassist.InterTest");
CtMethod cm = CtMethod.make("public static void test2();",cc);
cm.setBody("{System.out.println(\"这只是一个测试类的方法2\");}");
cc.addMethod(cm);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
}
try {
System.out.println(cc.getName());
System.out.println(cc.getSimpleName());
System.out.println(Arrays.toString(cc.toBytecode()) );
} catch (IOException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
}
}
}
class InterTest {
public static void test(){
System.out.println("Hello World");
}
}
package com.liming.javassist;
import javassist.*;
import java.io.IOException;
public class JavassistTest {
public static void main(String[] args) {
System.out.println("Hello Javassist");
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.makeClass("com.liming.javassist.Emp");
try {
CtField cf1 = CtField.make("private int age;",cc);
CtField cf2 = CtField.make("private String name;",cc);
cc.addField(cf1);
cc.addField(cf2);
CtMethod cm1 = CtMethod.make("public String getName(){return name;}",cc);
CtMethod cm2 = CtMethod.make("public int getAge(){return age;}",cc);
CtMethod cm3 = CtMethod.make("public void test(){System.out.println(\"HelloWorld\");}",cc);
CtConstructor cctr = new CtConstructor(new CtClass[]{CtClass.intType,cp.get("java.lang.String")},cc);
cctr.setBody("{this.age = $1;this.name = $2;}");
cc.addMethod(cm1);
cc.addMethod(cm2);
cc.addMethod(cm3);
cc.addConstructor(cctr);
cc.writeFile();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (NotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}