import javassist.*;
import lombok.Data;
import org.springframework.beans.BeanUtils;
@Data
class Person {
private String name;
}
public class ReflectUtil {
public static Class<?> addMethodToClass(Class clazz, String methodBody) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass ctClass = pool.get(clazz.getName());
CtMethod ctMethod = CtNewMethod.make(methodBody, ctClass);
ctClass.addMethod(ctMethod);
ctClass.setName(ctClass.getName() + "Proxy");
return ctClass.toClass();
}
public static void main(String[] args) throws Exception {
Class proxyClass = addMethodToClass(Person.class, "public String sayHello(int age) {\n" +
" System.out.println(\"Hello, I'm \" + name + \", age \" + age);\n" +
" return \"Hello\";\n" +
" }");
Object personProxy = proxyClass.newInstance();
Person person = new Person();
person.setName("Tony");
BeanUtils.copyProperties(person, personProxy);
Object result = proxyClass.getMethod("sayHello", int.class).invoke(personProxy, 18);
System.out.println(result);
}
}
Hello, I'm Tony, age 18
Hello
必须要修改ctClass的name,否则会报错,因为
toClass
会生成类,并进行类加载,但内存中已经存在一个该类了, 所以会加载失败。