• java 动态代理


      代理模式是基础的代理模式之一。常用的AOP,日志都是代理模式现象的。在不改变原来的类或者方法的前提下,对外提供增值服务。

    java 实现代理的方式

      1)代理分静态代理,

      2)jdk动态代理,

      3)Cglib动态代理。

    静态代理实现方式

      代码静态代理,主要通过继承相同的接口

    java jdk 动态代理实现方式

      java jdk 动态代理。主要是实现 InvocationHandler 接口即可

    举个例子

    package proxy;
    
    /**
     * @author ZHONGZHENG664
     * @date 2018/8/31.
     */
    public interface User {
        void getNmae();
        void getAge();
    
        /**
         * 获取工资
         * @return
         */
        int getSarly(int month);
    }
    View Code

    实现类

    package proxy;
    
    /**
     * @author ZHONGZHENG664
     * @date 2018/8/31.
     */
    public class RealUser implements User {
    
        public void getNmae() {
            System.out.println("my name is xiaoming");
        }
    
        public void getAge() {
            System.out.println("my age is 14");
        }
    
        public int getSarly(int month) {
    
            return month+200;
        }
    }
    View Code

    代理实现:增加日志

    package proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * @author ZHONGZHENG664
     * @date 2018/8/31.
     */
    public class DynamicProxy implements InvocationHandler {
        private Object user;
    
        public DynamicProxy(Object user) {
            this.user = user;
        }
    
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before rent house");
    
            System.out.println("Method:" + method);
    
            //    当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
            method.invoke(user, args);
    
            //  在代理真实对象后我们也可以添加一些自己的操作
            System.out.println("after rent house");
    
            return null;
        }
    }
    View Code

    测试类:

    package proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    /**
     * @author ZHONGZHENG664
     * @date 2018/8/31.
     */
    public class TestProxy {
        public static void main(String[] gars) {
            RealUser realUser = new RealUser();
            DynamicProxy dynamicProxy = new DynamicProxy(realUser);
            User user = (User) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(),
                    realUser.getClass().getInterfaces(),
                    dynamicProxy);
            System.out.println(user.getClass().getName());
            user.getAge();
            user.getNmae();
            System.out.println("my sarly:"+user.getSarly(80));
        }
    }
    View Code

     

    学习的时间不一定要特定安排
  • 相关阅读:
    sublime Text3插件无法安装解决方法(提示There are no packages available installation)
    扫码消费数量栏点击可编辑,失去焦点还原样式
    浏览器内核
    js全选checkbox框
    word-wrap: break-word;与word-break: break-all;文本自动换行
    含加减的输入框
    linux ,mac连接, git pull error, chmod修改文件的权限/chown修改文件和目录的所有者
    vue修改对象的属性值后页面不重新渲染
    jsp 判断时间大小
    利用js实现 禁用浏览器后退| 去除上一个历史记录链接
  • 原文地址:https://www.cnblogs.com/zhongzheng123/p/9578863.html
Copyright © 2020-2023  润新知