Skip to content

动态代理

zhangpan edited this page Aug 20, 2021 · 5 revisions

1.静态代理的缺点

  • 由于代理类要实现与被代理类一致的接口,当有多个类需要被代理时,要么代理类实现所有被代理类的接口,这样会使代理类过于庞大;要么使用多个代理类,每个代理类只代理一个被代理类,但是这样又会需要构造多个代理类。

  • 当接口需要增加、删除、修改方法时,被代理类与代理类都需要修改,不易维护。

为了解决上述问题,可以使用动态代理,自动生成代理类。

2. 动态生成类的原理

动态代理是在运行时根据某个interface生成对应的代理类的字节码,然后加载到JVM的,并创建这个接口的实例的过程。

3.使用JDK提供的接口实现动态代理

这里涉及到两个类:java.lang.reflect.Proxyjava.lang.reflect.InvocationHandler接口

举个例子:

Ryan想在上海买一套房子,但是他又不懂房地产的行情,于是委托了中介(Proxy)来帮助他买房子。

使用动态代理实现,首先定义一个IPersonBuyHouse的接口,且有一个buyHouse的方法:

public interface IPersonBuyHouse {
  void buyHouse(String name);
}

使用动态代理实现Ryan买房子的需求:

public static void main(String[] args) {
    InvocationHandler handler = new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            if (method.getName().equals("buyHouse")) {
                System.out.println(args[0] + " will buy a house.");
            }
            return null;
        }
    };
    IPersonBuyHouse person = (IPersonBuyHouse) Proxy
            .newProxyInstance(IPersonBuyHouse.class.getClassLoader(), // ClassLoader
                    new Class[]{IPersonBuyHouse.class}, // 传入要实现的接口
                    handler); // 传入处理调用方法的InvocationHandler
    person.buyHouse("Ryan");
}

公众号:玩转安卓Dev

Java基础

面向对象与Java基础知识

Java集合框架

JVM

多线程与并发

设计模式

Kotlin

Android

Android基础知识

Android消息机制

Framework

View事件分发机制

Android屏幕刷新机制

View的绘制流程

Activity启动

性能优化

Jetpack&系统View

第三方框架实现原理

计算机网络

算法

其它

Clone this wiki locally