-java 动态代理设计模式

来源:互联网 发布:法院书记员打字软件 编辑:程序博客网 时间:2024/05/01 13:22

   今天学习java 动态代理设计模式,虽然学习的有点模糊,

  java 中,当我们有时候需要给已经写好的方法增加相应的功能的时候,没错,我们可以用继承来实现,不过继承也是有缺点的,继承只能导致所写的方法越来越多。并不能很好的起到效果。所以我们引入了代理。

  代理,我们平时生活中也见到许多,我们平时上网也经常使用代理。

  Java中代理可以用聚合,继承,动态代理实现代理。

    //以下是聚合方式实现代理。

           public    class Tank

       {

                 public  void move()

           {

          System.out.prinltn("Moveing....");

                 //   
          }

      }

           // 这是聚合的方式实现代理

        public class Tank3 extends Tank

      {

            Tank t;

public Tank3(Tank t)

{

this.t=t;

}

public void move()

{

         System.out.println("start moveing");

        t.move();//调用

          System.out.println("Stop move");

}

        }


 

java动态代理类位于Java.lang.reflect包下  

Proxy,  该类即为动态代理类....InvocationHandler该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法, 这个抽象方法在代理类中动态实现。

   

import java.lang.reflect.InvocationHandler ;  

import java.lang.reflect.Proxy ;  

import java.lang.reflect.Method ;  

interface Subject{  

    public String say(String name,int age) ;    // 定义抽象方法say  

}  

class RealSubject implements Subject{   // 实现接口  

    public String say(String name,int age){  

        return "姓名:" + name + ",年龄:" + age ;  

    }  

};  

class MyInvocationHandler implements InvocationHandler{  

    private Object obj ;  

   public Object bind(Object obj){  

        this.obj = obj ;    // 真实主题类  

        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this) ;  

    }  

    public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{  

        Object temp = method.invoke(this.obj,args) ;    // 调用方法  

        return temp ;  

    }  

};  

public class DynaProxyDemo{  

    public static void main(String args[]){  

        Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;  

      String info = sub.say("Hello",30) ;  

        System.out.println(info) ;  

   }  

};