`
dahuilang
  • 浏览: 10099 次
  • 性别: Icon_minigender_1
  • 来自: 烟台
社区版块
存档分类
最新评论

java 反射 动态代理

阅读更多
1.       首先完成一个接口的创建(里面有真正的想要实现的方法):

public interface Subject {

              public void request();//想要实现的方法

}

2.    写一个真实的主题类实现Subject接口(并实现其中的方法):

      public class RealSubject implements Subject {

            public void request() {//实现接口中的方法

               System.out.println("真实的主题的实现的方法");

           }

}

3.    写一个动态的代理类实现InvocationHandler接口:

//动态的代理类应该实现的是InvocationHandler接口(在java.lang.reflect包下)

public class Proxyhandle implements InvocationHandler {

    Object obj = null;

    //写一个绑定的方法,绑定不同的接口进行代理

    public Object bind(Object obj){

       this.obj = obj;

       //该方法的返回值是一个对象

       //Proxy有一个方法newProxyInstace();有三个参数:第一个:表示所代理的真实类类的实例的类的加载器

       //第二个参数表示是:所要代理的真实类所实现的接口

       //第三个是:代理类本身

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

    }

    //InvocationHandler接口中的方法invoke()

    //invoke()之中的method就是表示真实类中实现接口中的那个方法

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

           throws Throwable {

           //调用参数method中的invoke()方法,其中有两个参数

           //第一个参数表示:代理的真实类

           //第二个参数表示:传入的参数 对象数组

          System.out.println("代理之前的任务~~~");

          Object o = method.invoke(this.obj, args);

          System.out.println("代理之后的任务~~");

          return o;//返回一个所代理的接口的实现类

          }

    }

4.    测试动态代理的类:TestProxy
public class TestProxy {
        public static void main(String args[]){
             Proxyhandle ph = new Proxyhandle();//拿到代理类的对象
              //绑定代理的真实的主题对象
             Subject sub = (Subject) ph.bind(new RealSubject());//将真实主题与代理进行绑定
             sub.request();//调用真实对象的request(是实现接口中的方法)
              //这时候代理类中的invock()方法将会被自动调用完成代理过程
        }
               //代理不同的真实类的话就直接改变bind()方法中的参数,传入你想要代理的真实类就ok
               //这样就实现了动态的代理了
}
这样四步就完成来了一个动态代理的实例,每一步在代码中都有解释!
分享到:
评论
1 楼 dreamhunter 2012-04-28  
sub.request();//调用真实对象的request(是实现接口中的方法)
//这时候代理类中的invock()方法将会被自动调用完成代理过程

为什么这个invoke函数会被自动调用呢?

相关推荐

Global site tag (gtag.js) - Google Analytics