• 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

     

    学习的时间不一定要特定安排
  • 相关阅读:
    最小二乘法拟合圆
    OpenCV solve() 解线性方程
    Halcon、OpenCV、C++ 实现最小二乘法拟合直线
    Halcon 字符串与HTuple互转,double与HTuple互转,Mat与HObject互转
    Halcon的HWindowControl控件在WinForm程序中的使用介绍(重点解决图片缩放的问题)
    将Halcon HObject类型转为Qt QImage类型
    Halcon HImage 与 Qt QImage 的相互转换
    Qt 加载DLL的几种方式小结
    Halcon17无法加载"hdevenginecpp":找不到指定的模块
    Halcon 安装提示 could not write updated path to HKLM
  • 原文地址:https://www.cnblogs.com/zhongzheng123/p/9578863.html
Copyright © 2020-2023  润新知