java assist_Java-Javaassist(一)

这篇博客介绍了如何使用Javaassist库动态创建类、添加属性和方法,并生成对应的字节码文件。示例代码展示了如何创建一个包含构造器、getter/setter方法的Employ类,并进行了实例化及方法调用。
摘要由CSDN通过智能技术生成

Javaassist

/**

* Copyright (C) 2017-2018 All Rights Reserved.

*/

package javassistdemo;

import javassist.*;

import java.io.IOException;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

public class TestJavaAssist {

//创建线程池

public static ClassPool pool = ClassPool.getDefault();

public static CtClass clazz = pool.makeClass("Employ");

public static void test01() throws CannotCompileException, IOException, NotFoundException {

try {

//创建属性方法一

CtField ctFieldOne = CtField.make("private Integer empId;", clazz);

clazz.addField(ctFieldOne);

CtField ctFieldTwo = CtField.make("private Integer empAge;", clazz);

clazz.addField(ctFieldTwo);

//创建属性方法二

CtField ctFieldThree = new CtField(pool.get("java.lang.String"),"empName", clazz);

ctFieldThree.setModifiers(Modifier.PRIVATE);

clazz.addField(ctFieldThree);

//创建含参构造器

CtConstructor constructor = new CtConstructor(new CtClass[]{pool.get("java.lang.Integer"), pool.get("java.lang.String"),pool.get("java.lang.Integer")}, clazz);

constructor.setBody("{this.empId = $1; this.empName = $2; this.empAge = $3;}");

clazz.addConstructor(constructor);

//创建方法方法一

CtMethod ctMethodOne = CtMethod.make("public Integer getEmpId() {return empId;}", clazz);

clazz.addMethod(ctMethodOne);

CtMethod ctMethodTwo = CtMethod.make("public void setEmpId(Integer empId) {this.empId = empId;}", clazz);

clazz.addMethod(ctMethodTwo);

//创建方法方法二

clazz.addMethod(CtNewMethod.getter("getEmpAge", ctFieldTwo));

clazz.addMethod(CtNewMethod.setter("setEmpAge", ctFieldTwo));

} catch (CannotCompileException e) {

e.printStackTrace();

}

clazz.writeFile( System.getProperty("user.dir")+"/src/main/java/javassistdemo/");

}

public static void main(String[] args) {

try {

test01();

Class clazzEmploy = clazz.toClass();

//调用含参构造器

Object obj = clazzEmploy.getConstructor(Integer.class,String.class,Integer.class).newInstance(1,"Sandy",8);

//调用方法

Method method =clazzEmploy.getDeclaredMethod("getEmpAge");

System.out.println("method.invoke(obj): " + method.invoke(obj));

} catch (Exception e) {

e.printStackTrace();

}

}

}

main()方法运行完test01()方法后,在指定路径下会生成Employ.class文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值