0
点赞
收藏
分享

微信扫一扫

快速掌握动态代理

大师的学徒 2022-01-16 阅读 42

目录

1、是什么?

代理(Proxy):即代替处理,类似于中间人这一角色。

调用如何在客户端无感(动态代理)

基于动态代理生成代理对象,当调用代理对象的方法时,由代理进行相关信息(方法、参数等)的组装并发送到服务器进行远程调用,并由代理接收调用结果并返回。

1.1 动态代理和静态代理的区别

静态代理的代理对象和被代理对象在代理之前就已经确定,它们都实现相同的接口或继承相同的抽象类。静态代理模式一般由业务实现类和业务代理类组成,业务实现类里面实现主要的业务逻辑,业务代理类负责在业务方法调用的前后作一些你需要的处理,以实现业务逻辑与业务方法外的功能解耦,减少了对业务方法的入侵。静态代理又可细分为:基于继承的方式和基于聚合的方式实现。

静态代理模式的代理类,只是实现了特定类的代理,代理类对象的方法越多,你就得写越多的重复的代码。动态代理就可以动态的生成代理类,实现对不同类下的不同方法的代理。

JDK 动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用业务方法前调用InvocationHandler 处理。代理类必须实现 InvocationHandler 接口,并且,JDK 动态代理只能代理实现了接口的类

2、怎么用

使用 JDK 动态代理类基本步骤:

1、编写需要被代理的类和接口

2、编写代理类,需要实现 InvocationHandler 接口,重写 invoke() 方法;

3、使用Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)动态创建代理类对象,通过代理类对象调用业务方法。

3、举例

3.1 创建接口

public interface Demo {

    String hello(String msg);
}

3.2 创建实现类

public class DemoImpl implements Demo{
    @Override
    public String hello(String msg) {
        System.out.println("msg="+msg);
        return "hello";
    }
}

3.3 创建代理类

public class DemoProxy implements InvocationHandler {

    Demo demo;
    public DemoProxy(Demo demo){
        this.demo=demo;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("开始之前");
       Object value=method.invoke(demo,args);
        System.out.println("开始之后");
        return value;
    }
}

3.4 测试

public static void main(String[] args) {
        DemoProxy proxy=new DemoProxy(new DemoImpl());
       Demo demo= (Demo) Proxy.newProxyInstance(
                Demo.class.getClassLoader(),
                new Class<?>[]{Demo.class},
                proxy
        );
        System.out.println(demo.hello("你好"));
    }

测试结果

开始之前
msg=你好
开始之后
hello

举报

相关推荐

0 条评论