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



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 block
				e.printStackTrace();
			} catch (NotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}  
	        // 打印创建类的类名  
	        try {
				System.out.println(cls.toClass());
			} catch (CannotCompileException e) {
				// TODO Auto-generated catch block
				e.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));  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值