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

    动态代理的功能:

    1:增强一个类的方法。

    2:在不修改源类的情况下,修改类的行为或是方法。

    在Java中有一个类

    Proxy

    动态代理在运行时,会创建被代理类的接口号的子类.

    1:只这么一个要求:

    所有被代理的类,必须要拥有一个接口。

    2:动态代理有两个核心类

    1:Proxy具体类,它的静态方法newProxyInstance用于动态的创建一些接口的子类.

    2:InvocationHandler – 执行的句柄 (即在执行时可以拦到代理人的所有方法)

    有一个方法

    Invoke(Object proxy,Method mehod,Object[] args)

    Prxoy:代理人.

    Method:被执行的代理人的方法的反射对象。

    此method与tom有相同的功能。来自于同一个接口。

    Args:方法上的参数

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    public class ProxyDemo {
        public static void main(String[] args) {
            //1:声明Tom实例,被代理对象
            final Tom tom = new Tom();
            //2:声明tom的代理对象
            Object obj =
                    Proxy.newProxyInstance(
                            ProxyDemo.class.getClassLoader(),//用哪一个类加载器在内存中创建IPerson的子类
                            new Class[]{IPerson.class},//指定创建哪一些接口的子类
                            new InvocationHandler() {
                                public Object invoke(Object proxy, Method method, Object[] args)
                                        throws Throwable {
                                    System.err.println("准备好");
                                    //动态的执行tom这个类的run方法
                                    method.invoke(tom,args);
                                    System.err.println("第一名");
                                    return null;
                                }
                            });
            //3:目前obj就是IPerson的子类
            System.err.println(obj.getClass());
            IPerson tomProxy = (IPerson) obj;
            tomProxy.run();
        }
    }
    
    
    //开发一个接口
    interface IPerson{
        public void run();
        public void say();
    }
    //开发一个具体类
    class Tom implements IPerson{
        public void run() {
            System.err.println("正在跑步...ing....");
        }
        public void say() {
            System.err.println("你好我们是朋友");
        }
    }
    
    class com.sun.proxy.$Proxy0
    准备好
    跑步中
    第一名

  • 相关阅读:
    docker搭建主从复制mysql
    mysql主从复制(mariadb)
    docker搭建mysql8.0
    docker安装mysql
    终端配置kxsw
    AJAX教程
    移动端常见布局
    css为什么需要精灵图
    元素的显示与隐藏
    css网页布局总结
  • 原文地址:https://www.cnblogs.com/xiaweifeng/p/3697479.html
Copyright © 2011-2022 走看看