文章目录
一、使用javassist实现接口
前提 :
创建了一个名为:com.powernode.bank.dao.AccountDao的包
里边的接口:(AccountDao) 仅有一个方法 且返回值为void
package com.powernode.bank.dao;
public interface AccountDao {
void delete();
}
1.获取类池
//获取类池
ClassPool pool = ClassPool.getDefault();
2.制造类
//获取类
CtClass ctClass = pool.makeClass("com.powernode.bank.dao.impl.AccountDaoImpl");
3.制造接口
//获取接口
CtClass ctInterface = pool.makeInterface("com.powernode.bank.dao.AccountDao");
4.添加接口到类中
//将接口添加到类中
ctClass.addInterface(ctInterface);//AccountDaoImpl implements AccountDao
5.实现接口中的方法
5.1制造方法
//获取方法
String methodCode = "public void delete(){System.out.println(\"hello delete!!\");}";
CtMethod ctMethod = CtMethod.make(methodCode, ctClass);
5.2将方法添加到类中
//将方法添加到类中
ctClass.addMethod(ctMethod);
5.3生成类
在内存中生成类,同时将生成的类加载到JVM中
//在内存中生成class 同时将生成的类直接加载到JVM中
Class<?> clazz = ctClass.toClass();
5.4创建接口对象
//获取接口对象
AccountDao accountDao = (AccountDao) clazz.newInstance();
5.5实现接口
//实现接口
accountDao.delete();
二、总代码
/**
* 使用javassist动态生成类并实现接口
*/
@Test
public void testGenerateImpl() throws Exception {
//获取类池
ClassPool pool = ClassPool.getDefault();
//获取类
CtClass ctClass = pool.makeClass("com.powernode.bank.dao.impl.AccountDaoImpl");
//获取接口
CtClass ctInterface = pool.makeInterface("com.powernode.bank.dao.AccountDao");
//将接口添加到类中
ctClass.addInterface(ctInterface);//AccountDaoImpl implements AccountDao
//实现接口中的方法 (先制造方法出来)
//获取方法
String methodCode = "public void delete(){System.out.println(\"hello delete!!\");}";
CtMethod ctMethod = CtMethod.make(methodCode, ctClass);
//将方法添加到类中
ctClass.addMethod(ctMethod);
//在内存中生成class 同时将生成的类直接加载到JVM中
Class<?> clazz = ctClass.toClass();
//获取接口对象
AccountDao accountDao = (AccountDao) clazz.newInstance();
//实现接口
accountDao.delete();
}