使用javaassist在内存中动态生成类

http://blog.csdn.net/lvshaorong/article/details/49951551


  1. public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, InvocationTargetException {  
  2.         // TODO Auto-generated method stub  
  3.         // 创建类    
  4.             ClassPool pool = ClassPool.getDefault();    
  5.             CtClass cls = pool.makeClass("com.situ.super.Sclass");    
  6.             try {   
  7.             // 添加私有成员name及其getter、setter方法    
  8.             CtField param = new CtField(pool.get("java.lang.String"), "name", cls); //相当于private String name  
  9.             param.setModifiers(Modifier.PRIVATE);  //私有修饰  
  10.         cls.addMethod(CtNewMethod.setter("setName", param));//增加set方法,名字为"setName"  
  11.             cls.addMethod(CtNewMethod.getter("getName", param));//增加get方法,名字为getname  
  12.             cls.addField(param, Initializer.constant("")); //写入class文件   
  13.                 
  14.             // 添加无参的构造体    
  15.             CtConstructor cons = new CtConstructor(new CtClass[] {}, cls);  //相当于public Sclass(){this.name = "brant";}  
  16.             cons.setBody("{name = \"Brant\";}");    
  17.             cls.addConstructor(cons);    
  18.                 
  19.             // 添加有参的构造体    
  20.             cons = new CtConstructor(new CtClass[] {pool.get("java.lang.String")}, cls);//把参数列表写在本行    
  21.             cons.setBody("{$0.name = $1;}");  //第一个传入的形参$1,$2第二个传入的形参,相当于public Sclass(String s){this.name = s;}  
  22.             cls.addConstructor(cons);    
  23.   
  24.                 //把生成的class文件写入文件,也可以不写入  
  25.                 byte[] byteArr = ctClass.toBytecode();    
  26.                 FileOutputStream fos = new FileOutputStream(new File("D://Emp.class"));    
  27.                 fos.write(byteArr);    
  28.                 fos.close();    
  29.   
  30.             } catch (CannotCompileException e) {  
  31.                 // TODO Auto-generated catch block  
  32.                 e.printStackTrace();  
  33.             } catch (NotFoundException e) {  
  34.                 // TODO Auto-generated catch block  
  35.                 e.printStackTrace();  
  36.             }    
  37.             // 打印创建类的类名    
  38.             try {  
  39.                 System.out.println(cls.toClass());  
  40.             } catch (CannotCompileException e) {  
  41.                 // TODO Auto-generated catch block  
  42.                 e.printStackTrace();  
  43.             }    
  44.               
  45.         
  46.     }  


  1. //=======================================================上面是关键,创建一个新类,底下是一般的反射调用       
  2.      // 通过反射创建无参的实例,并调用getName方法    
  3.         Object o = Class.forName("com.situ.super.Sclass").newInstance();  //为了防止编译器报错,先用o声明,并一直使用Class.forName来获取类文件  
  4.         Method getter = o.getClass().getMethod("getName");    
  5.         System.out.println(getter.invoke(o));    
  6.             
  7.         // 调用其setName方法    
  8.         Method setter = o.getClass().getMethod("setName"new Class[] {String.class});    
  9.         setter.invoke(o, "Adam");    
  10.         System.out.println(getter.invoke(o));    
  11.             
  12.         // 通过反射创建有参的实例,并调用getName方法    
  13.         Object oo = Class.forName("com.situ.super.Sclass").getConstructor(String.class).newInstance("Liu Jian");  //调用构造有参函数  
  14.         getter = o.getClass().getMethod("getName");    
  15.         System.out.println(getter.invoke(o));    


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值