| 4 | import java.lang.reflect.Method; |
| 5 | |
| 6 | public class Test { |
| 7 | public static void createStudent() throws Exception { |
| 8 | ClassPool pool = ClassPool.getDefault(); |
| 9 | CtClass cc = pool.makeClass("src\\test\\java\\examples.Student"); |
| 10 | // 字段名为name |
| 11 | CtField param = new CtField(pool.get("java.lang.String"),"name", cc); |
| 12 | // 访问级别是 private |
| 13 | param.setModifiers(Modifier.PRIVATE); |
| 14 | // 初始值是 "Frankyu" |
| 15 | cc.addField(param, CtField.Initializer.constant("Frankyu")); |
| 16 | |
| 17 | // 生成 getter、setter 方法 |
| 18 | cc.addMethod(CtNewMethod.setter("setName", param)); |
| 19 | cc.addMethod(CtNewMethod.getter("getName", param)); |
| 20 | |
| 21 | // 添加无参的构造函数 |
| 22 | CtConstructor cons = new CtConstructor(new CtClass[]{}, cc); |
| 23 | cons.setBody("{name = \"yubo\";}"); |
| 24 | cc.addConstructor(cons); |
| 25 | |
| 26 | // 5. 添加有参的构造函数 |
| 27 | cons = new CtConstructor(new CtClass[]{pool.get("java.lang.String")}, cc); |
| 28 | // $0=this / $1,$2,$3... 代表方法参数 |
| 29 | cons.setBody("{$0.name = $1;}"); |
| 30 | cc.addConstructor(cons); |
| 31 | |
| 32 | // 6. 创建一个名为printName方法,无参数,无返回值,输出name值 |
| 33 | CtMethod ctMethod = new CtMethod(CtClass.voidType, "printName", new CtClass[]{}, cc); |
| 34 | ctMethod.setModifiers(Modifier.PUBLIC); |
| 35 | ctMethod.setBody("{System.out.println(name);}"); |
| 36 | cc.addMethod(ctMethod); |
| 37 | |
| 38 | //这里会将这个创建的类对象编译为.class文件 |
| 39 | cc.writeFile(""); |
| 40 | } |
| 41 | public static void usingStudent() throws Exception{ |
| 42 | ClassPool pool = ClassPool.getDefault(); |
| 43 | CtClass cc = pool.getCtClass("src\\test\\java\\examples.Student"); |
| 44 | // 实例化 |
| 45 | Object student = cc.toClass().newInstance(); |
| 46 | // 设置值 |
| 47 | Method setName = student.getClass().getMethod("setName", String.class); |
| 48 | setName.invoke(student, "junjie"); |
| 49 | // 输出值 |
| 50 | Method execute = student.getClass().getMethod("printName"); |
| 51 | execute.invoke(student); |
| 52 | } |
| 53 | public static void main(String[] args) throws Exception{ |
| 54 | createStudent(); |
| 55 | usingStudent(); |
| 56 | } |
| 57 | } |
nothing calls this directly
no outgoing calls
no test coverage detected