• Java代理


    如果有个接口Usermanager,里面有个抽象方法addUser. 有个类UserManagerImpl实现了这个接口,现在需要在添加用户前统一给用户设定一个当前时间的值,静态代理的做法是建一个新的代理类,同样实现Usermanager接口,在代理类里调用委托类的方法,并在方法前后完成逻辑。这样两个类的耦合度太高,修改一个往往另一个也要修改
     
    同样的需求,动态代理的方法是建一个类a,里面创建一个方法,返回值为一个任意类型的Object,传入参数为需要代理的类,在方法里使用 Proxy.newProxyInstance() 来创建一个反射实例返回,该方法有三个参数,第一个为代理类的类加载器,一般通过对象.getClass().getClassLoader()来获得,第二个为代理类要实现的接口列表,通过对象.getClass().getInterfaces()来获得,第三个为代理实例调用处理程序需要实现的接口,通过new InvocationHandler()来获得,并且重写里面的invoke方法,invoke方法返回值默认为Object,如果不需要返回值直接返回null。该方法有三个参数,第一个为需要调用方法的代理实例,第二个参数为与代理实例上所调用的接口方法相对应的实例方法,第三个参数为代理实例调用的接口方法所需要的参数,所以可以通过method.invoke(Object,args)方法执行代理类的方法,传入代理的类的实例和参数。
     
    区别:静态代理要求代理类和委托类都要实现同一个接口,静态代理中代理类在编译期就已经确定好了,而动态代理则是在JVM运行时根据创建代理类传入的参数才确定要代理某个类,静态代理相对动态代理效率是要快一点,但是一旦要修改代码,代理类和委托类都需要修改。而动态代理则是要求委托类必须实现某个接口,代理类实现 InvocationHandler接口,通过反射来实现动态代理,好处是不用生成太多的代理类,坏处是使用了反射,比较消耗性能。
    不和别人一样,不复制只真正理解
  • 相关阅读:
    前端大文件分片上传/多线程上传
    网页大文件分片上传/多线程上传
    docker基础入门之二
    linux之iptable
    linux内核之网络协议栈
    ubuntu之iptables
    c++栈管理库TCMalloc、jeMalloc
    curl之post提交xml
    ceph基本操作整理
    docker基础入门之一
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12749823.html
Copyright © 2020-2023  润新知