前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中常用的代理技术

Java中常用的代理技术

原创
作者头像
用户3293499
发布2024-08-25 07:31:23
1340
发布2024-08-25 07:31:23
举报
文章被收录于专栏:Spring杂谈

代理

代理目前大致有以下几种:

  • JDK动态代理 基于接口
  • CGLib 动态生成子类
  • Javassist
  • Byte buddy

前两种是在spring中用的

JDK动态代理

代码语言:java
复制
public class ProxyTest {

 public interface F

    {

 public void say();

    }

 public interface O

    {

 public void sayOther();

    }

    @Test

 public void jdkTest() {

 Object obj = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] {F.class,O.class}, new InvocationHandler() {

            @Override

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

 F f = new F() {

                    @Override

 public void say() {

                        System.out.println("say F");

                    }

                };

 if(method.getName().equals("say")) {

                }

                System.out.println("say P");

                f.say();

 return null;

            }

        });

 F f = (F)obj;

        f.say();

    }

}

动态代理生成的对象继承Proxy,并实现了目标接口

CGLIB

CGLIB 通过ASM方法,加载并更改字节码,生成目标类的子类。

代码语言:java
复制
// 注意不能放在但愿你测试类中,否则会报错

// Superclass has no null constructors but no arguments were given

public class FD {

 public void say() {

        System.out.println("");

    }

}

@Test

public void cglibTest() {

 Enhancer enhancer = new Enhancer();

    enhancer.setSuperclass(FD.class);

    enhancer.setCallback(new MethodInterceptor() {

        @Override

 public Object intercept(Object source, Method method, Object[] args,MethodProxy methodProxy) throws Throwable 

        {

            System.out.println("say Cglib");

 Object result = methodProxy.invokeSuper(source, args);

 return result;

        }

    });

 ///

 FD f = (FD) enhancer.create();//new Class[] {this.getClass()}, new Object[] {this});//create();

    f.say();

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代理
    • JDK动态代理
      • CGLIB
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档