代理模式

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

  一、简介:

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

 

posted on 2018-03-06 22:39  bluej  阅读(149)  评论(0编辑  收藏  举报

导航