zoukankan      html  css  js  c++  java
  • 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接口,通过反射来实现动态代理,好处是不用生成太多的代理类,坏处是使用了反射,比较消耗性能。
    不和别人一样,不复制只真正理解
  • 相关阅读:
    C语言寒假大作战01
    C语言I作业12—学期总结
    C语言I博客作业11
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    计算机组成与设计 复习
    概率论与数理统计 期末复习
    SPM(Software Project Management)课程感想
    Software Project Management_JUnit && Maven
  • 原文地址:https://www.cnblogs.com/Vinlen/p/12749823.html
Copyright © 2011-2022 走看看