<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.27.0-GA</version>
</dependency>
import javassist.*;
public class JavassistUtil {
public static void addField(ClassPool pool, String className, String fieldName, CtClass fieldType) throws NotFoundException, CannotCompileException {
CtClass ctClass = pool.get(className);
CtField ctField = new CtField(fieldType, fieldName, ctClass);
ctClass.addField(ctField);
}
public static void addMethod(ClassPool pool, String className, String methodName, CtClass returnType, CtClass[] parameterTypes, String methodBody) throws NotFoundException, CannotCompileException {
CtClass ctClass = pool.get(className);
CtMethod ctMethod = new CtMethod(returnType, methodName, parameterTypes, ctClass);
ctMethod.setBody(methodBody);
ctClass.addMethod(ctMethod);
}
}
public class Main {
public static void main(String[] args) throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get("com.example.MyClass");
CtClass fieldType = pool.get("java.lang.String");
JavassistUtil.addField(pool, "com.example.MyClass", "newField", fieldType);
CtClass returnType = pool.get("void");
CtClass[] parameterTypes = new CtClass[]{};
String methodBody = "{ System.out.println(\"Hello, dynamic method!\"); }";
JavassistUtil.addMethod(pool, "com.example.MyClass", "newMethod", returnType, parameterTypes, methodBody);
Class modifiedClass = ctClass.toClass();
Object object = modifiedClass.newInstance();
}
}