Javassist(1)-helloworld-edu

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

    }
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息