1、静态代理例子

在静态代理中,代码对象和被代理的对象必须实现一个接口,完整保留被代理对象的接口,也要将接口不变的原则一直保持。

公共接口:

IStaticProxy.java

   
   
   
   
  1. public interface IStaticProxy { 
  2.  
  3.     public void say(); 
  4.  

接口实现类:

StaticProxyImpl.java

   
   
   
   
  1. public class StaticProxyImpl implements IStaticProxy { 
  2.  
  3.     @Override 
  4.     public void say() { 
  5.         System.out.println("I want to say!"); 
  6.     } 
  7.  

代理类:

StaticProxy.java

   
   
   
   
  1. public class StaticProxy { 
  2.     /** 
  3.      * 接口声明  
  4.      */ 
  5.     private IStaticProxy iStaticProxy; 
  6.  
  7.     public IStaticProxy getiStaticProxy() { 
  8.         return iStaticProxy; 
  9.     } 
  10.  
  11.     public void setiStaticProxy(IStaticProxy iStaticProxy) { 
  12.         this.iStaticProxy = iStaticProxy; 
  13.     } 
  14.  
  15.     public void talk() { 
  16.         System.out.println("say()方法之前"); 
  17.         iStaticProxy.say(); 
  18.         System.out.println("say()方法之后"); 
  19.     } 

测试类:

StaticProxyTest.java

   
   
   
   
  1. public class StaticProxyTest { 
  2.     public static void main(String[] args) { 
  3.         StaticProxy staticProxy = new StaticProxy(); 
  4.         staticProxy.setiStaticProxy(new StaticProxyImpl()); 
  5.         staticProxy.talk(); 
  6.     } 

静态代理的扩展性不好,多个类就需要多个代理类。

 

2、动态代理例子

公共接口:

IDynamicProxy.java

   
   
   
   
  1. public interface IDynamicProxy { 
  2.  
  3.     public void say(); 
  4.  

接口实现类:

DynamicProxyImpl.java

   
   
   
   
  1. public class DynamicProxyImpl implements IDynamicProxy { 
  2.  
  3.     @Override 
  4.     public void say() { 
  5.         System.out.println("I want to say!"); 
  6.     } 
  7.  

动态代理类:

DynamicProxy.java

   
   
   
   
  1. public class DynamicProxy implements InvocationHandler { 
  2.     private Object object; 
  3.  
  4.     public Object getObject() { 
  5.         return object; 
  6.     } 
  7.  
  8.     public void setObject(Object object) { 
  9.         this.object = object; 
  10.     } 
  11.  
  12.     public Object bind(Object object) { 
  13.         this.object = object; 
  14.         return Proxy.newProxyInstance(this.getObject().getClass() 
  15.                 .getClassLoader(), this.getObject().getClass().getInterfaces(), 
  16.             this); 
  17.     } 
  18.  
  19.     @Override 
  20.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  21.         Object return_object = null
  22.         System.out.println("say()方法之前"); 
  23.         return_object = method.invoke(this.getObject(), args); 
  24.         System.out.println("say()方法之后"); 
  25.         return return_object; 
  26.     } 

动态代理测试类:

DynamicProxyTest.java

   
   
   
   
  1. public class DynamicProxyTest { 
  2.     public static void main(String[] args) { 
  3.         DynamicProxy dynamicProxy = new DynamicProxy(); 
  4.         IDynamicProxy iDynamicProxy = (IDynamicProxy) dynamicProxy 
  5.                 .bind(new DynamicProxyImpl()); 
  6.         iDynamicProxy.say(); 
  7.     } 

动态代理避免了静态代理接口固定的缺点,增强了扩展性。

调用实现类的方法时,虚拟机会自动交给代理类的InvocationHandler的invoke方法,并在该方法内来执行。