cglib动态代理

分手后的思念是犯贱 2022-05-09 02:08 189阅读 0赞

cglib实现的代理为被代理类的子类,当调用代理类方法的时候,会根据设置的回调类,执行里面的拦截的方法。

被代理的类:

  1. package com.xhx.java;
  2. public class Hello {
  3. public void say(){
  4. System.out.println("hello world");
  5. }
  6. }

首先创建代理类:用Enhancer,设置被代理的类和回调的方法。

  1. package com.xhx.java;
  2. import net.sf.cglib.proxy.Callback;
  3. import net.sf.cglib.proxy.Enhancer;
  4. public class ProxyBuilder {
  5. public static Object getHelloProxy(Class clazz, Callback callback) {
  6. Enhancer enhancer = new Enhancer();
  7. //设置父类
  8. enhancer.setSuperclass(clazz);
  9. //设置回调类 拦截方法 MethodInterceptor的 intercept方法
  10. enhancer.setCallback(callback);
  11. //生成代理对象
  12. return enhancer.create();
  13. }
  14. }

回调方法的拦截器,继承MethodInterceptor

  1. package com.xhx.java;
  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.Method;
  6. public class HelloProxy implements MethodInterceptor {
  7. /**
  8. * 接口的回调方法
  9. * @param o cglib生成的代理对象
  10. * @param method 被代理的方法
  11. * @param objects 方法入参
  12. * @param methodProxy 代理方法
  13. * @return
  14. * @throws Throwable
  15. */
  16. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
  17. System.out.println("前");
  18. System.out.println(method.toString());
  19. System.out.println(methodProxy.toString());
  20. System.out.println(o.getClass().toString());
  21. Object result = methodProxy.invokeSuper(o, objects);
  22. //这种方法相当于一直调用代理类的方法,就会一直回调,造成死循环
  23. //Object rest = methodProxy.invoke(o,objects);
  24. System.out.println("后");
  25. return result;
  26. }
  27. /**
  28. public void com.xhx.java.Hello.say()
  29. net.sf.cglib.proxy.MethodProxy@4667ae56
  30. class com.xhx.java.Hello$$EnhancerByCGLIB$$d156e917
  31. hello world
  32. */
  33. }

测试:

  1. package com.xhx.java;
  2. public class App {
  3. public static void main(String[] args) {
  4. Hello hello = (Hello)ProxyBuilder.getHelloProxy(Hello.class, new HelloProxy());
  5. hello.say();
  6. }
  7. }

70

**实时内容请关注微信公众号,公众号与博客同时更新:程序员星星**

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIzMjY0NjI_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,189人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Cglib动态代理

           JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字

    相关 CGLIB动态代理

    一 说明 使用火车站卖票,使用CGLIB代理实现。 如果没有定义SellTickets接口,只定义了TrainStation(火车站类)。很显然JDK代理是无法使用了