javaassist官方地址: http://jboss-javassist.github.io/javassist/java
Javaassist hello world demo ,演示了 Javaassist 用java编程的方式在程序运行时建立一个新的Class对象。git
本示例使用jar版本为:github
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.22.0-CR1</version>
<dependency>编程
参考资料:.net
http://blog.csdn.net/sadfishsc/article/details/9999169code
http://yonglin4605.iteye.com/blog/1396494对象
package net.j4love.javaassist.edu; import javassist.ClassPool; import javassist.CtClass; import javassist.CtConstructor; import javassist.CtField; import javassist.CtMethod; import javassist.CtNewMethod; import javassist.Modifier; import java.lang.reflect.Method; /** * Created by j4love on 2016/10/29. * Description : */ public class JavassistHelloWorld { public static void main(String[] args) throws Exception { ClassPool pool = ClassPool.getDefault(); // 产生一个新的Class实例 CtClass ctClass = pool.makeClass("net.j4love.javaassist.edu.$DynamicObject"); // 在新产生的 Class 中新增一个 name 属性 CtField nameField = new CtField(pool.get("java.lang.String"), "name", ctClass); nameField.setModifiers(Modifier.PRIVATE); // 为 name 属性添加 setter & getter 方法 ctClass.addMethod(CtNewMethod.setter("setName",nameField)); ctClass.addMethod(CtNewMethod.getter("getName",nameField)); // 设置 name 属性的初始值 ctClass.addField(nameField, CtField.Initializer.constant("")); CtMethod saySomething = new CtMethod(CtClass.voidType, "saySomething", new CtClass[]{}, ctClass); saySomething.setModifiers(Modifier.PUBLIC); saySomething.setBody("{System.out.println(\"it enables Java programs to define a new class at runtime and to modify a class file when the JVM loads it.\");}"); ctClass.addMethod(saySomething); // 为 Class 新增默认的无参构造器 CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); ctConstructor.setBody("{}"); ctClass.addConstructor(ctConstructor); // 在内存中生成 Class 实例 Class clazz = ctClass.toClass(); System.out.println("class name = " + clazz.getName()); // 经过反射调用 saySomething 方法 Object obj = clazz.newInstance(); Method saySomethingMethod = clazz.getDeclaredMethod("saySomething"); saySomethingMethod.setAccessible(false); saySomethingMethod.invoke(obj); // 经过反射调用 setter & getter 方法 Method setNameMethod = clazz.getDeclaredMethod("setName",String.class); setNameMethod.invoke(obj,"恐龙 Danny"); Method getNameMethod = clazz.getDeclaredMethod("getName"); Object name = getNameMethod.invoke(obj); System.out.println("name = " + name); } }