• 代理模式


      今天看大牛黄勇的源码,代理方面颇有感触,因此做下笔记和学习。

      一、简介:

      代理模式包含静态代理、动态代理,其中动态代理又有JAVA通过接口实现方式和CGLI通过类实现方式。

      二、原理

      无论是JAVA通过接口实现方式,还是CGLI通过类实现方式,都是通过目标接口或类的类加载器,JVM运行时生成一个代理对象,代理对象包含目标接口或类的所有方法。而在通过代理对象调用方法时,首先执行invoke(),然后通过反射执行目标方法(反射这个执行过程区,可以执行其他代码内容,比如通过netty实现RPC调用,这正是感触的地方)。

      三、代码

      1.demo执行

     1 package com.bluejie.bluej.java.design.proxy;
     2 
     3 /**
     4  * Created by bluej on 2018-03-06.
     5  */
     6 public class Demo {
     7     public static void main(String[] args) {
     8         MyProxy1();
     9         //MyProxy2();
    10 
    11     }
    12     private static void MyProxy1(){
    13         ProductService productService =(ProductService) new MyProxy1().getInstance(new ProductServiceImpl());
    14         String name = productService.getProductName();
    15         System.out.println("--name:"+name);
    16     }
    17     private static void MyProxy2(){
    18         ProductService productService = MyProxy2.getInstance(new ProductServiceImpl());
    19         String name = productService.getProductName();
    20         System.out.println("--name:"+name);
    21     }
    22 }
    Demo代码

      

     1 package com.bluejie.bluej.java.design.proxy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 /**
     8  * 代理模式
     9  */
    10 public class MyProxy1 implements InvocationHandler {
    11     private Object target;
    12 
    13 
    14     public Object getInstance(Object target){
    15         this.target = target;
    16         return  Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    17 
    18     }
    19 
    20     @Override
    21     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    22         System.out.println("--MyProxy1--invoke()--");
    23         return method.invoke(target,args);
    24     }
    25 }
    MyProxy1
     1 package com.bluejie.bluej.java.design.proxy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 /**
     8  * Created by bluej on 2018-03-06.
     9  */
    10 public class MyProxy2 {
    11       public static  <T> T getInstance(Object target){
    12 
    13         return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {
    14             @Override
    15             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    16                 System.out.println("--MyProxy2--invoke()--");
    17                 return method.invoke(target,args);
    18             }
    19         });
    20 
    21     }
    22 }
    MyProxy2

    MyProxy1 和MyProxy2 都是代理模式的实现形式,写法不同而已。 

  • 相关阅读:
    命名对象继承2-验证Open*命名对象安全属性的传递
    命名对象继承1-验证Create*命名对象安全属性的传递
    讨论c/c++计算小数的精度问题
    隐藏进程名
    一个函数重载问题
    02-Python基础之列表
    01-Python基础之字符串
    django 实用工具dj-database-url 快速配置数据库
    Gerrit安装配置
    关于数学的摘抄
  • 原文地址:https://www.cnblogs.com/bluej/p/8519634.html
Copyright © 2020-2023  润新知