创建 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 { @Test public 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"); //实现 interface ctClass.addInterface(ctInterface); //实现 接口中的方法 //创造 method CtMethod ctMethod = CtMethod.make("public int delete(){System.out.println(\"run delete method\");return 0;}", ctClass); //将方法添加到类上 ctClass.addMethod(ctMethod); //加载 生成的 类的字节码到 JVM Class<?> aClass = ctClass.toClass(); //create instance AccountDao 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 { @Test public 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"); //实现 interface ctClass.addInterface(ctInterface); //实现 接口中的方法 //获取接口中的方法 Method[] declaredMethods = AccountDao.class.getDeclaredMethods(); //遍历实现所有的 method Arrays.stream(declaredMethods).forEach( method -> { StringBuilder methodCode = new StringBuilder(); //method code methodCode.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 { //创造 method ctMethod = CtMethod.make(methodCode.toString(), ctClass); //将方法添加到类上 ctClass.addMethod(ctMethod); } catch (Exception e) { e.printStackTrace(); } } ); //加载 生成的 类的字节码到 JVM Class<?> aClass = ctClass.toClass(); //create instance AccountDao accountDao = (AccountDao) aClass.newInstance(); accountDao.delete(1); accountDao.select(2); } }