zoukankan      html  css  js  c++  java
  • Java中动态代理工作流程

      当谈到动态代理就会想到接口,因为接口是一种规范,动态代理对象通过接口便会很清楚地知道他的实现类(被代理对象)是何种类型的(即有哪些方法)。Now,然我们来开始编写一个例子来了解动态代理的全过程

    第一:既然接口那么好使,就先定义一个接口Action

    package com.lzj.Spring_first.testAgentMyPractice;
    
    public interface Action {
    //    定义方法
        public void say();
        public void doSomething();
    }

    第二:既然有了接口,接下来咱们就得有实现类。所以再定义Action的实现类ActionImpl

    package com.lzj.Spring_first.testAgentMyPractice;
    
    public class ActionImpl implements Action {
    
        @Override
        public void say() {
            System.out.println("Study hard...day day up...");
    
        }
    
        @Override
        public void doSomething() {
            System.out.println("Nothing wants to be done...");
    
        }
    
    }

    第三:既然要代理,就必须弄个代理对象,我这里是实现的java.lang.reflect下的InvocationHandler接口。spring框架也有自己的InvocationHandler接口,这个只要保证你引入的包一致即可,不要引了java.lang下的又引spring下的就行

    package com.lzj.Spring_first.testAgentMyPractice;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class AgentFunc implements InvocationHandler{
    //    要被代理的对象
        Object target;
        public AgentFunc(Object target) {
            this.target = target;
        }
    //    代理对象执行的方法
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // TODO Auto-generated method stub
            return method.invoke(target, args);
        }
    
    }

    第四:完事具备,就差一个测试方法了,Come on...

    package com.lzj.Spring_first.testAgentMyPractice;
    
    import java.lang.reflect.Proxy;
    
    public class Test {
        public static void main(String[] args) {
    //        要被代理的对象
            ActionImpl actionImpl = new ActionImpl();
    //       第一个是代理类在哪个类执行时加载
    //       第二个参数是实现类实现的接口,而不能写成Action.class.getInterfaces()显然是错误的,因为该接口没有接口,而且第二参数要的是实现类的接口即Action
    //       第三个则是代理类的执行方法所在,即我们写的代理类
            Action action = (Action) Proxy.newProxyInstance(Action.class.getClassLoader(), new Class[]{Action.class}, new AgentFunc(actionImpl));
         action.say();
      }
    }

     最后输出结果...亲测成功,自己可以去试试!好了以上仅是自己对动态代理的独自见解,如有出处可以留言...

  • 相关阅读:
    IS上部署MVC网站,打开后ExtensionlessUrlHandler-
    深拷贝与浅拷贝
    python小技巧---打印出不同颜色的输出
    环境搭建之allure的安装配置,及简单使用
    Python进行JSON格式化输出,以及汉字显示问题
    无限遍历,Python实现在多维嵌套字典、列表、元组的JSON中获取数据
    环境准备—之—linux下安装svn--开机自启--及format权限问题
    环境准备—之—linux下安装python3和pip3
    环境准备—之—linux下安装jdk
    问题1——之Linux虚拟机ip地址消失
  • 原文地址:https://www.cnblogs.com/lzj123/p/6496963.html
Copyright © 2011-2022 走看看