GetterSetterProxy.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package J20250807;
  2. import net.sf.cglib.proxy.Enhancer;
  3. import net.sf.cglib.proxy.MethodInterceptor;
  4. import net.sf.cglib.proxy.MethodProxy;
  5. import java.lang.reflect.Field;
  6. import java.lang.reflect.Method;
  7. /**
  8. * @author WanJl
  9. * @version 1.0
  10. * @title GetterSetterProxy
  11. * @description 使用CGLIB动态代理实现自动生成get和set方法
  12. * @create 2025/8/7
  13. */
  14. public class GetterSetterProxy implements MethodInterceptor {
  15. //被代理的目标对象
  16. private Object target;
  17. /**
  18. * 拦截器方法,实现动态生成的getter和setter
  19. *
  20. * @param o
  21. * @param method
  22. * @param objects
  23. * @param methodProxy
  24. * @return
  25. * @throws Throwable
  26. */
  27. @Override
  28. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  29. //获取到方法名
  30. String methodName = method.getName();
  31. //处理getter方法
  32. if (methodName.startsWith("get")&&method.getParameterCount()==0){
  33. //返回处理getter的方法
  34. return handelGetter(methodName);
  35. }
  36. //处理setter方法
  37. if (methodName.startsWith("set")&&method.getParameterCount()==1){
  38. //返回处理setter的方法
  39. return handelSetter(methodName,objects[0]);
  40. }
  41. //既不是get也不是set,就执行
  42. return methodProxy.invoke(o,objects);
  43. }
  44. /**
  45. * 处理set方法
  46. * @param methodName
  47. * @param value
  48. * @return
  49. */
  50. private Object handelSetter(String methodName, Object value) throws Exception {
  51. String fieldName=Character.toLowerCase(methodName.charAt(3))+methodName.substring(4);
  52. Field field = target.getClass().getDeclaredField(fieldName);
  53. field.setAccessible(true);
  54. field.set(target,value);
  55. return null;
  56. }
  57. /**
  58. * 处理get方法
  59. * @param methodName
  60. * @return
  61. */
  62. private Object handelGetter(String methodName) throws Exception{
  63. //从方法名中提取属性名getName--->xxx
  64. //Character.toLowerCase 把字符转换为小写 把setName中大写的N转换为小写
  65. //methodName.substring(4)从索引值为4的位置开始截取,进行拼接 最终得到name
  66. String fieldName=Character.toLowerCase(methodName.charAt(3))+methodName.substring(4);
  67. Field field = target.getClass().getDeclaredField(fieldName);
  68. field.setAccessible(true);
  69. return field.get(target);
  70. }
  71. /**
  72. * 创建代理对象
  73. *
  74. */
  75. public Object createProxy(Object target) {
  76. //检查是否被@GetterAndSetter注解进行修饰
  77. if (!target.getClass().isAnnotationPresent(GetterAndSetter.class)) {
  78. return target;
  79. }
  80. //使用CGLIB创建代理
  81. Enhancer enhancer = new Enhancer();
  82. //设置父类为目标类
  83. enhancer.setSuperclass(target.getClass());
  84. //设置回调对象
  85. enhancer.setCallback(this);
  86. //创建代理对象实例并且返回
  87. return enhancer.create();
  88. }
  89. }