java设计模式---动态代理(简单笔记)

来源:互联网 时间:1970-01-01

     所谓动态代理类是在运行时生成的class,在生成它时,你必须提供一组interface给它,则动态代理类就宣称它实现了这些interface。当然,动态代理类就充当一个代理,你不要企图它会帮你干实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

下面通过实例来说明:

Subject.java   抽象借口:声明代理对象和真实对象的共同接口

[java]

public interface Subject { 

    public void doSomething(); 

public interface Subject {

 public void doSomething();

}

 RealSubject.java   真实被代理对象
[java]
public class RealSubject implements Subject { 
    @Override 
    public void doSomething() { 
        System.out.println("RealSubject.doSomething"); 
    } 

public class RealSubject implements Subject {
 @Override
 public void doSomething() {
  System.out.println("RealSubject.doSomething");
 }
}

 
DynamicProxy.java  代理对象

[java]
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
 
public class DynamicProxy implements InvocationHandler { 
    private Object object; 
    public DynamicProxy(Object object) { 
        this.object = object; 
    } 
 
    @Override 
    public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { 
        System.out.println("Before Invoke ! method : " + method); 
         
        //我们可以再代理方法调用前后添加功能  
        Object result = method.invoke(object, args); 
         
        System.out.println("object : " + object + "/tresult : " + result + "/targs : " + args); 
        System.out.println("After Invoke !"); 
        return result; 
    } 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxy implements InvocationHandler {
 private Object object;
 public DynamicProxy(Object object) {
  this.object = object;
 }

 @Override
 public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
  System.out.println("Before Invoke ! method : " + method);
  
  //我们可以再代理方法调用前后添加功能
  Object result = method.invoke(object, args);
  
  System.out.println("object : " + object + "/tresult : " + result + "/targs : " + args);
  System.out.println("After Invoke !");
  return result;
 }
}


 

Client.java   测试

[java]
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Proxy; 
 
public class Client { 
    public static void main(String[] args) throws Exception { 
         
        //创建目标对象,也就是被代理对象  
        RealSubject realSubject = new RealSubject(); 
         
        //将目标对象交给代理  
        InvocationHandler handler = new DynamicProxy(realSubject); 
         
//      Class<?> proxyClass = Proxy.getProxyClass(Subject.class.getClassLoader()  
//              , new Class[]{Subject.class});  
//      Subject subject = (Subject)proxyClass.getConstructor(new Class[]{InvocationHandler.class})  
//              .newInstance(new Object[]{handler});  
         
        //返回代理对象,相当于上面两句  
        Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(), 
                realSubject.getClass().getInterfaces(), 
                handler); 
         
        //叫代理对象去doSomething(),其实在代理对象中的doSomething()中还是会  
        //用handler来调用invoke(proxy, method, args) 参数proxy为调用者subject(this),  
        //method为doSomething(),参数为方法要传入的参数,这里没有  
        subject.doSomething(); 
    } 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Client {
 public static void main(String[] args) throws Exception {
  
  //创建目标对象,也就是被代理对象
  RealSubject realSubject = new RealSubject();
  
  //将目标对象交给代理
  InvocationHandler handler = new DynamicProxy(realSubject);
  
//  Class<?> proxyClass = Proxy.getProxyClass(Subject.class.getClassLoader()
//    , new Class[]{Subject.class});
//  Subject subject = (Subject)proxyClass.getConstructor(new Class[]{InvocationHandler.class})
//    .newInstance(new Object[]{handler});
  
  //返回代理对象,相当于上面两句
  Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
    realSubject.getClass().getInterfaces(),
    handler);
  
  //叫代理对象去doSomething(),其实在代理对象中的doSomething()中还是会
  //用handler来调用invoke(proxy, method, args) 参数proxy为调用者subject(this),
  //method为doSomething(),参数为方法要传入的参数,这里没有
  subject.doSomething();
 }
}

 

打印结果:
Before Invoke ! method : public abstract void Subject.doSomething()
RealSubject.doSomething
object : [email protected]    result : null    args : null
After Invoke !


注意:

Java动态代理涉及到的两个类:

     InvocationHandler:该接口中仅定义了一个Object : invoke(Object proxy, Method method, Object[] args);参数proxy指代理类,method表示被代理的方法,args为method中的参数数组,返回值Object为代理实例的方法调用返回的值。这个抽象方法在代理类中动态实现。

     Proxy:所有动态代理类的父类,提供用于创建动态代理类和实例的静态方法。

 

 


相关阅读:
Top