使用javassist的其中一个作用就是首先在用Mybatis框架搭建MVC三层架构时,由于Dao层的Impl类没有什么“必要”的作用,因此可以“不创建”这个类。
在pom.xml文件中加入javassist依赖
<dependency>
<groupId>org.example</groupId>
<artifactId>javassist</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
这个类池就是用来给我们生成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);
ctClass.toClass();
类加载到JVM当中 返回XxxDaoImpl 类的字节码
Class<?> clazz = Class.forName("com.powernode.bank.dao.impl.AccountDaoImpl");
利用反射机制
//创建对象
Object obj = clazz.newInstance();
//创建对象
Method insert = clazz.getDeclaredMethod("insert");
//创建对象
insert.invoke(obj);
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);
}
}