使用Javassist 动态生成类

文章目录

  • 一、Javassist
  • 二、使用javassist步骤
    • 1.获取类池
    • 2.制造类
    • 3.制造方法
    • 4.将方法添加到类中
    • 5.在内存中生成class
    • 6.类加载
    • 7.实现XxxDaoImpl
      • 7.1创建对象
      • 7.2获取类中的方法
      • 7.3调用方法
    • 8.完整代码



一、Javassist

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

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

		<dependency>
            <groupId>org.examplegroupId>
            <artifactId>javassistartifactId>
            <version>1.0-SNAPSHOTversion>
        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);
    }
}

你可能感兴趣的:(java,jvm,mybatis,1024程序员节)