使用javaassist在内存中动态生成类
来源:互联网 发布:淘宝卖家怎么修改库存 编辑:程序博客网 时间:2024/06/05 00:58
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException {// TODO Auto-generated method stub// 创建类 ClassPool pool = ClassPool.getDefault(); CtClass cls = pool.makeClass("com.situ.super.Sclass"); try { // 添加私有成员name及其getter、setter方法 CtField param = new CtField(pool.get("java.lang.String"), "name", cls); //相当于private String name param.setModifiers(Modifier.PRIVATE); //私有修饰cls.addMethod(CtNewMethod.setter("setName", param));//增加set方法,名字为"setName" cls.addMethod(CtNewMethod.getter("getName", param));//增加get方法,名字为getname cls.addField(param, Initializer.constant("")); //写入class文件 // 添加无参的构造体 CtConstructor cons = new CtConstructor(new CtClass[] {}, cls); //相当于public Sclass(){this.name = "brant";} cons.setBody("{name = \"Brant\";}"); cls.addConstructor(cons); // 添加有参的构造体 cons = new CtConstructor(new CtClass[] {pool.get("java.lang.String")}, cls);//把参数列表写在本行 cons.setBody("{$0.name = $1;}"); //第一个传入的形参$1,$2第二个传入的形参,相当于public Sclass(String s){this.name = s;} cls.addConstructor(cons); //把生成的class文件写入文件,也可以不写入 byte[] byteArr = ctClass.toBytecode(); FileOutputStream fos = new FileOutputStream(new File("D://Emp.class")); fos.write(byteArr); fos.close(); } catch (CannotCompileException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} // 打印创建类的类名 try {System.out.println(cls.toClass());} catch (CannotCompileException e) {// TODO Auto-generated catch blocke.printStackTrace();} }
调用创建好的类
//=======================================================上面是关键,创建一个新类,底下是一般的反射调用 // 通过反射创建无参的实例,并调用getName方法 Object o = Class.forName("com.situ.super.Sclass").newInstance(); //为了防止编译器报错,先用o声明,并一直使用Class.forName来获取类文件 Method getter = o.getClass().getMethod("getName"); System.out.println(getter.invoke(o)); // 调用其setName方法 Method setter = o.getClass().getMethod("setName", new Class[] {String.class}); setter.invoke(o, "Adam"); System.out.println(getter.invoke(o)); // 通过反射创建有参的实例,并调用getName方法 Object oo = Class.forName("com.situ.super.Sclass").getConstructor(String.class).newInstance("Liu Jian"); //调用构造有参函数 getter = o.getClass().getMethod("getName"); System.out.println(getter.invoke(o));
0 0
- 使用javaassist在内存中动态生成类
- 通过代理接口在内存中动态生成代理类源代码并编译实现的真正动态代理
- jmagick 在内存中生成图片
- hsqldb在内存数据库中得使用
- 使用Qt在内存中画图
- 使用Qt在内存中画图
- Struts2中POI在内存中生成文件并下载
- 在内存中绘图
- 在内存中绘图
- 使用TClientDateSet 在内存中创建一个临时表
- VC中使用GDI+在内存转换图片类型
- 使用IStream和GDI+在内存中实现图像格式转换
- iphone使用loadNibNamed载入view在内存中得注意事项
- VC++控制台应用程序下使用GDI在内存中画图
- iphone使用loadNibNamed载入view在内存中得注意事项
- VC++使用CImage在内存中Jpeg转换Bmp图片
- VC++使用CImage在内存中Bmp转换Jpeg图片
- 数据在内存中各种形式
- Java会出现"unreachable code"错误的几个例子
- LinkedList
- SQL基础--> 约束(CONSTRAINT)
- Eclipse错误集(一)
- sleep和wait的区别
- 使用javaassist在内存中动态生成类
- 黑马程序员—IO流
- HTML5 内置本地数据库之Sqlite
- 杭电2647 Reward
- 一致性hash
- List of 50+ Face Detection / Recognition APIs, libraries, and software
- libc中的hook机制
- 最佳单例模式
- 前端代码发布系统-node开发