创建 interface
package com.wsd;public interface AccountDao {int delete(); }
利用 javassist 生产一个 类A, Class A implements AccountDao
package com.wsd;import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifier; import org.junit.Test;import java.lang.reflect.Method;/*** @program: webmybatis* @description: test Javassist* @author: Mr.Wang* @create: 2023-07-04 22:02**/ public class TestJavassist {@Testpublic void testImplementInterface() throws Exception{//获取一个默认的 ClassPool 实例//Javassist 是一个 Java 字节码编辑库,它可以在运行时修改已加载的类或者生成新的类。// ClassPool 是 Javassist 的核心组件,它是一个类容器,负责存储和管理字节码(.class 文件)ClassPool classPool = ClassPool.getDefault();//创建一个类,需要告知全类名CtClass ctClass = classPool.makeClass("com.wsd.TestGenerateCode");//创建一个interface,需要告知全类名CtClass ctInterface = classPool.makeInterface("com.wsd.AccountDao");//实现 interfacectClass.addInterface(ctInterface);//实现 接口中的方法//创造 methodCtMethod ctMethod = CtMethod.make("public int delete(){System.out.println(\"run delete method\");return 0;}", ctClass);//将方法添加到类上ctClass.addMethod(ctMethod);//加载 生成的 类的字节码到 JVMClass<?> aClass = ctClass.toClass();//create instanceAccountDao accountDao = (AccountDao) aClass.newInstance();accountDao.delete();}}
在实现接口中的方法时,并不能预先知晓接口中有哪些类,那么如何实现接口中的方法?
package com.wsd;import javassist.*; import org.junit.Test;import java.lang.reflect.Method; import java.util.Arrays;/*** @program: webmybatis* @description: test Javassist* @author: Mr.Wang* @create: 2023-07-04 22:02**/ public class TestJavassist {@Testpublic void testImplementInterface() throws Exception{//获取一个默认的 ClassPool 实例//Javassist 是一个 Java 字节码编辑库,它可以在运行时修改已加载的类或者生成新的类。// ClassPool 是 Javassist 的核心组件,它是一个类容器,负责存储和管理字节码(.class 文件)ClassPool classPool = ClassPool.getDefault();//创建一个类,需要告知全类名CtClass ctClass = classPool.makeClass("com.wsd.TestGenerateCode");//创建一个interface,需要告知全类名CtClass ctInterface = classPool.makeInterface("com.wsd.AccountDao");//实现 interfacectClass.addInterface(ctInterface);//实现 接口中的方法//获取接口中的方法Method[] declaredMethods = AccountDao.class.getDeclaredMethods();//遍历实现所有的 methodArrays.stream(declaredMethods).forEach(method -> {StringBuilder methodCode = new StringBuilder();//method codemethodCode.append("public " + method.getReturnType().getSimpleName() +" " + method.getName() + "(");//获取方法的参数列表Class<?>[] parameterTypes = method.getParameterTypes();//拼接形参列表for(int i = 0; i < parameterTypes.length; i++){String parameterName = parameterTypes[i].getSimpleName();methodCode.append( parameterName + " arg" + i);if(i == parameterTypes.length - 2){methodCode.append(", ");}}methodCode.append(")");//方法体methodCode.append("{System.out.println(\"run " + method.getName() + " method\");return ");//根据返回类型而拼接不同的返回值if( "int".equals( method.getReturnType().getSimpleName() ) ){methodCode.append("1;}");}else if("String".equals( method.getReturnType().getSimpleName() )){methodCode.append("\"success\";}");}System.out.println(methodCode.toString());CtMethod ctMethod = null;try {//创造 methodctMethod = CtMethod.make(methodCode.toString(), ctClass);//将方法添加到类上ctClass.addMethod(ctMethod);} catch (Exception e) {e.printStackTrace();}});//加载 生成的 类的字节码到 JVMClass<?> aClass = ctClass.toClass();//create instanceAccountDao accountDao = (AccountDao) aClass.newInstance();accountDao.delete(1);accountDao.select(2);} }