您的位置:首页 > 编程语言 > Java开发

java代理模式:静态代理VS动态代理

2018-04-27 14:33 381 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_37451441/article/details/80107330

一.静态代理:静态代理说白了就是在程序运行前就已经存在代理类的字节码文件,代理类和原始类的关系在运行前就已经确定。

     静态代理的特点:1.目标对象即被代理对象一定要实现接口;2.代理对象,要实现与目标对象一样的接口。

    //接口
    public interface  UserDAO  {

          void  save();
    }


    //目标对象即被代理类
    public class IUserDAO  implements  UserDAO {

          public  void  save(){
                do  something....
           }
     }


    //代理类与被代理类要实现同一个接口

    public class Proxy  implements  UserDAO {

        private UserDAO  userDAO  = new  IUserDAO();
             public  void  save(){
                  userDAO.save();//执行的是目标对象的方法
                  do  something....
             }

    }


二.动态代理模式:动态代理类的源码是在程序运行期间通过JVM反射等机制动态生成,代理类和委托类的关系是运行时才确定的。

     

     // 接口
     public interface IUserDao {
           void save();
           void find();

     }


      //目标对象

      class UserDao implements IUserDao{


      @Override
      public void save() {
           System.out.println("模拟: 保存用户!");

      }


      @Override
       public void find() {
            System.out.println("查询");
      }

}


/**
* 动态代理:
*    代理工厂,给多个目标对象生成代理对象!
*
*/
     class ProxyFactory {
         // 接收一个目标对象
         private Object target;
         public ProxyFactory(Object target) {
               this.target = target;

         }


         // 返回对目标对象(target)代理后的对象(proxy)
           public Object getProxyInstance() {
                  Object proxy = Proxy.newProxyInstance(
                  target.getClass().getClassLoader(),  // 目标对象使用的类加载器
                  target.getClass().getInterfaces(),   // 目标对象实现的所有接口
                  new InvocationHandler() {      // 执行代理对象方法时候触发
                        @Override
                       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                               // 获取当前执行的方法的方法名
                              String methodName = method.getName();
                              // 方法返回值
                               Object result = ;
                                if ("find".equals(methodName)) {
                                     // 直接调用目标对象方法
                                      result = method.invoke(target, args);
                                } else {
                                        System.out.println("开启事务...");
                                        // 执行目标对象方法
                                         result = method.invoke(target, args);
                                          System.out.println("提交事务...");
                              }
                               return result;
                       }
                    }
                 );
               return proxy;
          }
   }


   public  static void main(String[] args) {

        //创建目标对象

        IUserDao    target = new  UserDao();

        System.out.println("被代理对象:" + target.getClass());

        //创建代理对象

        IUserDao    proxy = (IUserDao) new ProxyFactory.getProxyInstance();

        System.out.println("被代理对象:" + proxy.getClass());

        proxy.save();//执行被代理类的方法

  }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: