使用Javassist 动态生成类



一、Javassist

使用javassist的其中一个作用就是首先在用Mybatis框架搭建MVC三层架构时,由于Dao层的Impl类没有什么“必要”的作用,因此可以“不创建”这个类。

在pom.xml文件中加入javassist依赖

		<dependency>
            <groupId>org.example</groupId>
            <artifactId>javassist</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

二、使用javassist步骤

1.获取类池

这个类池就是用来给我们生成class的

ClassPool pool = ClassPool.getDefault();

2.制造类

需要告诉javassist,类名是啥

CtClass ctClass = pool.makeClass("com.powernode.bank.dao.impl.AccountDaoImpl");

3.制造方法

String methodCode = "public void insert(){System.out.println(123);}";
CtMethod ctMethod = CtMethod.make(methodCode, ctClass);

4.将方法添加到类中

ctClass.addMethod(ctMethod);

5.在内存中生成class

ctClass.toClass();

6.类加载

类加载到JVM当中 返回XxxDaoImpl 类的字节码

Class<?> clazz = Class.forName("com.powernode.bank.dao.impl.AccountDaoImpl");

7.实现XxxDaoImpl

利用反射机制

7.1创建对象

//创建对象
        Object obj = clazz.newInstance();

7.2获取类中的方法

//创建对象
        Method insert = clazz.getDeclaredMethod("insert");

7.3调用方法

//创建对象
        insert.invoke(obj);

8.完整代码

package javassist;

import org.apache.ibatis.javassist.CannotCompileException;
import org.apache.ibatis.javassist.ClassPool;
import org.apache.ibatis.javassist.CtClass;
import org.apache.ibatis.javassist.CtMethod;
import org.junit.Test;

import java.lang.reflect.Method;

public class JavassistTest {
    @Test
    public void testGenerateFirstClass() throws Exception {
        //获取类池,这个类池就是用来给我们生成class的
        ClassPool pool = ClassPool.getDefault();
        //制造类(需要告诉javassist,类名是啥)
        CtClass ctClass = pool.makeClass("com.powernode.bank.dao.impl.AccountDaoImpl");
        //制造方法
        String methodCode = "public void insert(){System.out.println(123);}";
        CtMethod ctMethod = CtMethod.make(methodCode, ctClass);
        //最后需要将方法添加到类中
        ctClass.addMethod(ctMethod);
        //在内存中生成class
        ctClass.toClass();
        //类加载到JVM当中 返回AccountDaoImpl 类的字节码
        Class<?> clazz = Class.forName("com.powernode.bank.dao.impl.AccountDaoImpl");
        
        //创建对象
        Object obj = clazz.newInstance();
        //对象有了之后 可以获取AccountDaoImpl 类中的insert方法
        Method insert = clazz.getDeclaredMethod("insert");
        //调用方法
        insert.invoke(obj);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值