黑马程序员_代理

来源:互联网 发布:young网络用户名 编辑:程序博客网 时间:2024/05/22 16:39
------- android培训、java培训、期待与您交流! ----------


java中的代理:

代理说白了就是在执行某些方法之前或者之后执行其他代码或方法,

代理模式主要有两种:静态代理和动态代理

1. 静态代理:

  比如要在输出“HelloWorld”前打印一个字符串“Welcome”

  A:先定义一个接口类

  public interface HelloWorld {

  public void say();

  }

  B: 定义一个该接口的实现类

    public class HelloWorldImpl implements HelloWorld{

  public void say(){

  System.out.println("HelloWorld");

  }

    }

  

  C:定义一个静态代理类

  

  public class StaticProxy implements HelloWorld{

  public HelloWorld helloWorld ;

  public StaticProxy(HelloWorld helloWorld){

  this.helloWorld = helloWorld;

  }

  public void say2(){

  System.out.println("Welcome");

  helloWorld.say();     //调用say()方法   

  }

  }

 
   D: 测试类:

  Java代码

  public class Test {

  public static void main(String[] args){

  HelloWorld helloWorld = new HelloWorldImpl();

  StaticProxy staticProxy = new StaticProxy(helloWorld);

  staticProxy.say2();

  }

  }

打印结果为:

Welcome    
HelloWorld  

如果我们要在多个类中加这句话,那不是很麻烦,
动态代理就可以避免这个缺点。


2.  动态代理

  动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。

  动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类

  代理类:

  import java.lang.reflect.InvocationHandler;

  import java.lang.reflect.Method;

  import java.lang.reflect.Proxy;

  //动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类

  public class DynamicProxy implements InvocationHandler{

  private Object object;

  //绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。

  //Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法

  public Object bindRelation(Object object){

  this.object = object;

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

  }

  //拦截关联的这个实现类的方法被调用时将被执行

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

  System.out.println("Welcome");

  Object result = method.invoke(object, args);

  return result;

  }

  }

   
      测试类:

 
    public class Test {

  public static void main(String[] args){

  HelloWorld helloWorld = new HelloWorldImpl();

  DynamicProxy dp = new DynamicProxy();

  //在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。

  HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld); 

  helloWorld1.say();

  //helloWorld2将不被拦截

  HelloWorld helloWorld2 = new HelloWorldImpl();

  helloWorld2.say();

  }

  }

 //  bindRelation(helloWorld)   如果有多个我们在这里绑定多个,那不是很简单。


原创粉丝点击