zoukankan      html  css  js  c++  java
  • Java 动态代理

    动态代理指为一个目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。使用代理对象,是为了在不修改目标对象的基础上,增强目标对象的业务逻辑。通过动态代理可以无侵入的为代码进行增强。

    动态代理应用非常广泛,比如spring中的aop使用动态代理增加,动态代理主要有JDK和CGLIB两种。

    JDK实现动态代理由两个重要部分组成,分别是Proxy、InvocationHandler。

    Proxy是所有动态代理的父类,提供了静态方法来创建动态代理的class对象和实例。

    InvocationHandler,每个动态代理实例都有一个关联的InvocationHandler,在代理实例上调用方法将被转发到invoke方法。

    创建需要代理的目标接口和目标实现类

    public interface SomeService {
        public void doSome();
        public void doOther();
    }
    
    public class SomeServiceImpl implements SomeService {
        @Override
        public void doSome() {
            System.out.println("执行业务方法doSome");
        }
    
        @Override
        public void doOther() {
            System.out.println("执行业务方法doOther");
        }
    }

    创建InvocationHandler接口的实现类(代理类)

    public class MyInvocationHandler implements InvocationHandler {
        private Object targer;//目标对象
        public MyInvocationHandler (Object target) {
            this.target=target;
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) {
            System.out.println("执行invoke方法");
            System.out.println("在这里做执行方法之前要做的事情");
            String methodName=method.getName();
            Objet res=method.invoke(target, args);
            System.out.println("在这里做执行方法之后要做的事情");
            return res;
        }
    }

    通过代理类调用目标方法

    public static void main(String[] args) {
        //目标对象
        SomeService target=new SomeServiceImpl();
        //代理对象
        InvocationHandler handler=new MyInvocationHandler(target);
        SomeService proxy=(SomeService)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), handler);
        proxy.doSome();//执行第一个目标方法
        proxy.doOther();//执行第二个目标方法
    }
  • 相关阅读:
    第二阶段冲刺之站立会议5
    第二阶段冲刺之站立会议4
    第二阶段冲刺之站立会议3
    “加减乘除”使用说明
    第二阶段冲刺之站立会议2
    Kali学得好,监狱蹲到老,最新版Kali 2020
    【Linux】Centos7密码登录失败锁定设置_20200313
    【Linux】如何设置Linux开机 ,默认进入图形界面或命令行界面?
    【Linux】使用 PXE+Kickstart 无人值守批量安装系统
    【Linux】Linux修改openfile和max user processes?
  • 原文地址:https://www.cnblogs.com/DreamFather/p/14573807.html
Copyright © 2011-2022 走看看