引入依赖
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.25.0-GA</version>
</dependency>
要实现的接口
public interface IHandler {
void handle(String str);
}
代理类中使用的属性
public class User {
public String name;
}
代理实现
package com.javassit;
import javassist.*;
import javassist.bytecode.AccessFlag;
import javassist.bytecode.AnnotationsAttribute;
import javassist.bytecode.ConstPool;
import javassist.bytecode.FieldInfo;
public class Proxy {
public static void main(String[] args) throws NotFoundException, CannotCompileException, IllegalAccessException, InstantiationException {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.makeClass("handlerImpl");
CtClass interj = pool.getCtClass("com.javassit.IHandler");
CtClass[] interfaces = new CtClass[]{interj};
ctClass.setInterfaces(interfaces);
ConstPool constPool = ctClass.getClassFile().getConstPool();
CtField ctField = new CtField(pool.get("com.javassit.User"), "user", ctClass);
ctField.setModifiers(AccessFlag.PUBLIC);
ctClass.addField(ctField);
CtMethod[] methods = interj.getDeclaredMethods();
for(CtMethod method : methods) {
String methodName = method.getName();
CtMethod cm = new CtMethod(method.getReturnType(), methodName, method.getParameterTypes(), ctClass);
cm.setBody("{user = new com.javassit.User(); user.name = $1; return user;}");
ctClass.addMethod(cm);
}
Class<?> aClass = ctClass.toClass();
IHandler instance = (IHandler)aClass.newInstance();
User user = instance.handle("xwb");
System.out.println(user.name);
}
}
运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/3b4c3b9447184f658d8e4aeb3588f72d.png)