知识大全 Java中的静态代理和动态代理

Posted

篇首语:丈夫志四海,万里犹比邻。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中的静态代理和动态代理相关的知识,希望对你有一定的参考价值。

Java中的静态代理和动态代理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

   静态代理

  比如要在输出 HelloWorld 前打印一个字符串 Wele

  A:先定义一个接口类

  Java代码

  package ttitfly proxy;

  public interface HelloWorld

  public void print();

  //  public void say();

  

  package ttitfly proxy;

  public interface HelloWorld

  public void print();

  //  public void say();

  

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

  Java代码

  package ttitfly proxy;

  public class HelloWorldImpl implements HelloWorld

  public void print()

  System out println( HelloWorld );

  

  //  public void say()

  //      System out println( Say Hello! );

  // 

  

  package ttitfly proxy;

  public class HelloWorldImpl implements HelloWorld

  public void print()

  System out println( HelloWorld );

  

  //  public void say()

  //      System out println( Say Hello! );

  // 

  

  C:定义一个静态代理类

  Java代码

  package ttitfly proxy;

  public class StaticProxy implements HelloWorld

  public HelloWorld helloWorld ;

  public StaticProxy(HelloWorld helloWorld)

  this helloWorld = helloWorld;

  

  public void print()

  System out println( Wele );

  //相当于回调

  helloWorld print();

  

  //  public void say()

  //      //相当于回调

  //      helloWorld say();

  // 

  

  package ttitfly proxy;

  public class StaticProxy implements HelloWorld

  public HelloWorld helloWorld ;

  public StaticProxy(HelloWorld helloWorld)

  this helloWorld = helloWorld;

  

  public void print()

  System out println( Wele );

  //相当于回调

  helloWorld print();

  

  //  public void say()

  //      //相当于回调

  //      helloWorld say();

  // 

  

  D: 一个测试类:

  Java代码

  package ttitfly proxy;

  public class TestStaticProxy

  public static void main(String[] args)

  HelloWorld helloWorld = new HelloWorldImpl();

  StaticProxy staticProxy = new StaticProxy(helloWorld);

  staticProxy print();

  //      staticProxy say();

  

  

  package ttitfly proxy;

  public class TestStaticProxy

  public static void main(String[] args)

  HelloWorld helloWorld = new HelloWorldImpl();

  StaticProxy staticProxy = new StaticProxy(helloWorld);

  staticProxy print();

  //      staticProxy say();

  

  

  可以看出静态代理类有一个很不爽的缺点 当如果接口加一个方法(把上面所有的代码的注释给去掉) 所有的实现类和代理类里都需要做个实现 这就增加了代码的复杂度 动态代理就可以避免这个缺点

   动态代理

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

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

  代理类

  Java代码

  package ttitfly proxy;

  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( Wele );

  Object result = method invoke(object args);

  return result;

  

  

  package ttitfly proxy;

  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( Wele );

  Object result = method invoke(object args);

  return result;

  

  

  测试类

  Java代码

  package ttitfly proxy;

  public class TestDynamicProxy

  public static void main(String[] args)

  HelloWorld helloWorld = new HelloWorldImpl();

  DynamicProxy dp = new DynamicProxy();

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

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

  helloWorld print();

  helloWorld say();

  //helloWorld 将不被拦截

  HelloWorld helloWorld = new HelloWorldImpl();

  helloWorld print();

  helloWorld say();

  

  

  package ttitfly proxy;

  public class TestDynamicProxy

  public static void main(String[] args)

  HelloWorld helloWorld = new HelloWorldImpl();

  DynamicProxy dp = new DynamicProxy();

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

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

  helloWorld print();

  helloWorld say();

  //helloWorld 将不被拦截

  HelloWorld helloWorld = new HelloWorldImpl();

  helloWorld print();

  helloWorld say();

  

  

  在测试类里调用实现类的print和say方法 因为代理类里代理了HelloWorld的所有方法 所以就不需要像静态代理类那样一一实现了

  总结 由程序员创建或由特定工具自动生成源代码 再对其编译 在程序运行前 代理类的 class文件就已经存在了

  动态代理类 在程序运行时 运用反射机制动态创建而成

cha138/Article/program/Java/hx/201311/25797

相关参考

知识大全 Java 实践: 用动态代理进行修饰

Java实践:用动态代理进行修饰  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  动态代理工具是j

知识大全 java动态代理Dynamic Proxy

java动态代理DynamicProxy  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  被代理对

知识大全 Java动态代理机制综合分析及扩展

Java动态代理机制综合分析及扩展  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java动态代

知识大全 Java设计模式-----Proxy模式(动态代理)

Java设计模式-----Proxy模式(动态代理)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 浅谈Java中用动态代理类实现记忆功能

浅谈Java中用动态代理类实现记忆功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  记忆是衍生

知识大全 spring技术手册上的一个java动态代理例子

  Java代码  publicinterfaceIHello  publicvoidhello(Stringname);    Java代码  publicclassHelloImplimpleme

知识大全 JVM技术,反射与动态代理

JVM技术,反射与动态代理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java程序的工作机制

知识大全 实现动态代理的介绍和使用

  引言  假如现在我们有这样在这个示例中我将使用尽可能简单的逻辑实现所有功能需求这将更突出我们所要解决的核心问题例子是一个简单计算器类  publicclassCalculator pub

知识大全 动态代理

  动态代理  要求测算一个类里面的某个方法的执行时间  直接在一个测试的方法中调用这个类的方法就可以了也可以直接的写在这个类的main方法里面  继承这个类对需要测算时间的方法进行重写方法中这样来写

知识大全 Delphi中关于动态代理应用技巧

Delphi中关于动态代理应用技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本来想上周末没能用