Skip to content

Commit c3005fd

Browse files
author
yongjie.zhang
committed
javassist基本操作
1 parent d35524f commit c3005fd

File tree

3 files changed

+56
-5
lines changed

3 files changed

+56
-5
lines changed

.idea/modules.xml

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

java-Javassist/src/com/zyj/javassist/Demo02.java

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import javassist.*;
44

55
import java.io.IOException;
6+
import java.lang.reflect.Field;
67
import java.lang.reflect.Method;
78
import java.text.MessageFormat;
89
import java.util.Arrays;
@@ -54,23 +55,68 @@ public static void test02() throws Exception {
5455

5556
}
5657

57-
58+
/**
59+
* 修改已有方法的信息
60+
* @throws Exception
61+
*/
5862
public static void test03()throws Exception{
5963
ClassPool pool = ClassPool.getDefault();
6064
CtClass cc = pool.get("com.zyj.javassist.Emp");
6165

6266
CtMethod cm = cc.getDeclaredMethod("sayHello",new CtClass[]{CtClass.intType});
6367
cm.insertBefore("System.out.println($1);System.out.println(\"start!!!\");");
64-
68+
cm.insertAfter("System.out.println(\"end!!!!!!\");");
69+
//在某一行前面加上代码
70+
cm.insertAt(27,"empno = \"19191\";");
6571
//通过反射调用新生成的方法
6672
Class clazz = cc.toClass();
6773
Object obj = clazz.newInstance();
6874
Method m = clazz.getDeclaredMethod("sayHello",int.class);
69-
Object result = m.invoke(obj, 1111);
70-
System.out.println(result);
75+
m.invoke(obj, 1111);
76+
Method m2 = clazz.getDeclaredMethod("getEmpno",null);
77+
Object o = m2.invoke(obj);
78+
System.out.println(o);
79+
}
80+
81+
public static void test04()throws Exception{
82+
ClassPool pool = ClassPool.getDefault();
83+
CtClass cc = pool.get("com.zyj.javassist.Emp");
84+
85+
//CtField f1 = CtField.make("private int no;",cc);
86+
87+
CtField f1 = new CtField(CtClass.intType,"salary",cc);
88+
f1.setModifiers(Modifier.PRIVATE);
89+
cc.addField(f1);
90+
//获取指定的属性
91+
cc.getDeclaredField("salary");
92+
//增加相应的get和set方法
93+
/*cc.addMethod(CtNewMethod.getter("getSalary",f1)); //不可行,原因未知
94+
cc.addMethod(CtNewMethod.getter("setSalary",f1));*/
95+
//第一张方法::这样可行
96+
/*cc.addMethod(CtNewMethod.make("public void setSalary(int salary){this.salary = salary;}",cc));
97+
cc.addMethod(CtNewMethod.make("public int getSalary(){return this.salary;}",cc));*/
7198

99+
//第二种方法:亲测可行
100+
CtMethod setSalary = new CtMethod(CtClass.voidType, "setSalary", new CtClass[]{CtClass.intType}, cc);
101+
setSalary.setBody("this.salary = salary;");
102+
setSalary.setModifiers(Modifier.PUBLIC);
103+
CtMethod getSalary = new CtMethod(CtClass.intType, "getSalary", null, cc);
104+
getSalary.setBody("return salary;");
105+
getSalary.setModifiers(Modifier.PRIVATE);
106+
cc.addMethod(setSalary);
107+
cc.addMethod(getSalary);
108+
Class clazz = cc.toClass();
109+
Object obj = clazz.newInstance();
110+
Field field = clazz.getDeclaredField("salary");
111+
System.out.println(field.getName());
112+
Method setter = clazz.getDeclaredMethod("setSalary",int.class);
113+
setter.invoke(obj,3000);
114+
Method getter = clazz.getDeclaredMethod("getSalary");
115+
getter.setAccessible(true);
116+
Object re = getter.invoke(obj);
117+
System.out.println("salary:::"+re);
72118
}
73119
public static void main(String[] args) throws Exception {
74-
test03();
120+
test04();
75121
}
76122
}

java-Javassist/src/com/zyj/javassist/Emp.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public String getEmpno() {
2828
}
2929

3030
public void setEmpno(String empno) {
31+
System.out.println("1222");
3132
this.empno = empno;
3233
}
3334

0 commit comments

Comments
 (0)