关闭

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

1966人阅读 评论(0) 收藏 举报

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));  




0
0
查看评论

javaassist的用法

package com.dasenlin.baidu;import java.io.IOException;import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; i...
  • rentian1
  • rentian1
  • 2016-12-14 11:51
  • 1251

javaAssist的几个调用实例

package com.dasenlin.baidu;import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import jav...
  • rentian1
  • rentian1
  • 2016-12-17 11:39
  • 713

【Java】使用javaassist修改jar包

由于工作需要,可能会涉及到一些需要对第三方的一些jar包与源码进行修改的情况,这个时候javaassist就可以派上用场。
  • leilba
  • leilba
  • 2016-04-30 10:15
  • 2716

javaassist

  • 2016-04-29 09:54
  • 1.46MB
  • 下载

字节码操作_javassist库_动态创建新类_属性_方法_构造器_API详解JAVA216-217

字节码操作_javassist库_动态创建新类_属性_方法_构造器_API详解JAVA216-217
  • u013292493
  • u013292493
  • 2016-04-02 23:57
  • 2069

Javassist简单应用小结

概述   Javassist是一款字节码编辑工具,可以
  • mousebaby808
  • mousebaby808
  • 2014-07-11 15:37
  • 20677

Java学习之动态编译--字节码操作--javassist类库

一、字节码操作 Java动态性的两种常见实现方式: 字节码操作 反射 运行时操作字节码可以让我妈实现如下功能: 动态生成新的类 动态改变某个类的结构(添加/删除/修改 新的属性/方法) 优势: 比反射开销小,性能高 Javaasist性能高于反射,低于ASM 二、常见的字节码操作类库 1.BCEL ...
  • haitaofeiyang
  • haitaofeiyang
  • 2015-03-14 22:57
  • 5579

字节码操作 javaassist

JAVA 字节码操作利器javassist  hudashi 2016-03-14 14原文链接 1、简介 javassist是一个开源的分析、编辑和创建java字节码的类库。不需要了解虚拟机指令,就能动态生成类或者改变类的结构。 官网首...
  • kyi_zhu123
  • kyi_zhu123
  • 2016-09-13 08:53
  • 307

javaassist修改constructor构造函数,增加方法,修改方法

public class SimplePrincipal implements Principal, Serializable    35   {    36      private static final lo...
  • chuanzhongdu1
  • chuanzhongdu1
  • 2012-07-12 13:50
  • 1357

Javassist学习总结

要想将编译时不存在的类在运行时动态创建并加载,通常有两种策略: 1.      动态编译 2.      动态生成二进制字节码(.class) 对于第二种策略,实际上已经有诸多比较...
  • sadfishsc
  • sadfishsc
  • 2013-08-16 11:49
  • 33856
    个人资料
    • 访问:564969次
    • 积分:6075
    • 等级:
    • 排名:第4934名
    • 原创:150篇
    • 转载:0篇
    • 译文:1篇
    • 评论:216条
    最新评论