zoukankan      html  css  js  c++  java
  • 代理模式

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

      一、简介:

      代理模式包含静态代理、动态代理,其中动态代理又有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 都是代理模式的实现形式,写法不同而已。 

  • 相关阅读:
    开机画面自己定制方法
    【转】ipc$入侵详解之终极解惑篇
    【转】动态嵌入式dll木马清除方法
    ZT:让手机使用更顺畅 PPC系统注册表修改大全(4)
    Ubuntu下用Opera不能用中文输入的解决
    Ubuntu 8 下使用vmware server 1.0.8的几个要领
    MSSQL数据库自动同步
    在Ubuntu上安装PCMCIA接口CDMA上网卡的调试笔记(ZT)
    %0 的作用
    oracle自动imp脚本
  • 原文地址:https://www.cnblogs.com/bluej/p/8519634.html
Copyright © 2011-2022 走看看