Java:静态代理与动态代理

编程入门 行业动态 更新时间:2024-10-27 14:29:07

Java:<a href=https://www.elefans.com/category/jswz/34/1771395.html style=静态代理与动态代理"/>

Java:静态代理与动态代理

代理模式
为目标对象提供一个代理对象,外部对目标对象的访问,是通过代理委托进来的,以达到控制访问的目的。代理又分为静态代理和动态代理。

我们举个很常见的例子: 工厂会生产很多的玩具, 但是我们买玩具都是到商店买的, 而不是到工厂去买的,
工厂怎么生产我们并不关心, 我们只知道到商店可以买到自己想要的玩具,并且,如果我们需要送人的
商店可以把这些玩具使用礼品盒包装。这个工厂就是委托类, 商店就是代理类, 我们就是客户类。


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

实现静态代理的四个步骤:

  • 1)定义委托接口
  • 2)定义委托类实现委托接口
  • 3)定义代理类并实现委托接口
  • 4)最后便可通过客户端进行调用(这里可以理解成程序的main方法里的内容)

staticProxy.java:

public class staicProxy {//1、定义委托接口public interface Speakable{public void speak(String message);}//2、委托类实现接口public static class Person implements Speakable{//重写@Overridepublic void speak(String message){System.out.println("Fast:"+message);}}//3、代理类实现接口public static class PersonProxy implements Speakable{private Person persion;public PersonProxy(Person persion){this.persion=persion;}//重写@Overridepublic void speak(String message){this.persion.speak(message);System.out.println("运行时间:"+System.currentTimeMillis());}}//4、客户端调用public static void main(String[] args){Person person=new Person();PersonProxy proxy=new PersonProxy(person);proxy.speak("Chinese");}
}

动态代理
动态代理就是动态地创建代码并动态地处理方法的调用。

实现动态代理类的四个步骤:

  • 1)创建委托类的接口和类
  • 2)创建InvocationHandler接口的实现类,在invoke方法中实现代理逻辑
  • 3)通过Proxy的静态方法newProxyInstance( interfces.class.getClassLoader, Class[] interfaces, InvocationHandler h)创建一个代理对象
  • 4)使用代理对象

dynamicProxy.java:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class dynamicProxy {//1、我们直接使用staticProxy.java中的委托类和接口类,就不创建了//2、创建InvocationHandler接口的实现类public static class MyProxy implements InvocationHandler {private Object proxied;//被代理对象,Object类型//有参构造器,传入委托类的对象public MyProxy(Object proxied){this.proxied=proxied;}//重写@Overridepublic Object invoke(Object proxied, Method method, Object[] args)throws Throwable{method.invoke(this.proxied,args);//给对象proxied传递args参数System.out.println("运行时间:"+System.currentTimeMillis());return null;}}public static void main(String[] args){//创建委托类对象staicProxy.Person person=new staicProxy.Person();//创建动态代理对象//第一个参数是指定代理类的类加载器(我们传入当前测试类的类加载器//第二个参数是代理类需要实现的接口(我们传入委托类实现的接口,这样生成的代理类和委托类就实现了相同的接口)//第三个参数是invocation handler,用来处理方法的调用。这里是我们自己实现的handlestaicProxy.Speakable speakable=(staicProxy.Speakable) Proxy. newProxyInstance(staicProxy.Speakable.class.getClassLoader(),new Class[]{staicProxy.Speakable.class},new MyProxy(person));speakable.speak("Chinese");}
}

更多推荐

Java:静态代理与动态代理

本文发布于:2023-07-28 18:51:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1279574.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:静态   动态   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!