今天看大牛黄勇的源码,代理方面颇有感触,因此做下笔记和学习。
一、简介:
代理模式包含静态代理、动态代理,其中动态代理又有JAVA通过接口实现方式和CGLI通过类实现方式。
二、原理
无论是JAVA通过接口实现方式,还是CGLI通过类实现方式,都是通过目标接口或类的类加载器,JVM运行时生成一个代理对象,代理对象包含目标接口或类的所有方法。而在通过代理对象调用方法时,首先执行invoke(),然后通过反射执行目标方法(反射这个执行过程区,可以执行其他代码内容,比如通过netty实现RPC调用,这正是感触的地方)。
三、代码
1.demo执行
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
MyProxy1 和MyProxy2 都是代理模式的实现形式,写法不同而已。