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