java代理机制,java设计模式之代理模式

  java代理机制,java设计模式之代理模式

  如何解决写爬虫IP受阻的问题?立即使用。

  先介绍一下什么是代理。

  (学习视频分享:java视频教程)

  代理是一种设计模式,其核心思想是将对目标的访问转移到代理对象上。这样做的好处是,目标对象可以通过代理对象添加一些额外的功能,而无需更改代码。这是一种编程思路,在不改变原代码的情况下,通过代理增加一些扩展功能。

  代理过程如图,用户访问代理对象,代理对象访问目标对象,达到用户访问目标对象的目的。

  代理模式包括以下三个角色:

  ISubject:接口对象,它是由对象及其代理共享的接口。

  TargetSubject:目标对象,是实现抽象主题接口的类。

  Proxy:代理角色,包含对目标对象TargetSubject的引用,这样就可以操作真实的对象了。代理提供了与目标对象相同的接口,因此它可以随时替换目标对象。同时,代理对象在执行目标对象的操作时可以附加其他操作,相当于封装了真实对象。

  常见的代理模式有静态代理和动态代理,动态代理在Java中的实现有JDK动态代理和cglib代理。

  静态代理

  前面说过,代理模式有三个角色,一个是目标接口,一个是目标对象,第三个是代理对象。

  现在用具体代码实现了。首先,目标界面如下:

  公共接口IBlogService {

  void write blog();

  }目标对象用下面的代码实现目标接口:

  公共类BlogService实现IBlogService {

  @覆盖

  public void writeBlog() {

  System.out.println(我正在写.);

  }

  }静态代理对象,通过构造方法获取目标对象,实现目标接口。目标对象的方法在目标接口的方法中调用,代码如下:

  公共类BlogStaticProxy实现IBlogService{

  私有IBlogService blogService

  公共BlogStaticProxy(IBlogService blog service){

  this . blog service=blog service;

  }

  @覆盖

  public void writeBlog() {

  System.out.println(开始写入.);

  blog service . write blog();

  System.out.println(结束写入.);

  }

  }静态代理对象,通过构造方法获取目标对象,实现目标接口。目标对象的方法在目标接口的方法中调用,代码如下:

  公共类BlogStaticProxy实现IBlogService{

  私有IBlogService blogService

  公共BlogStaticProxy(IBlogService blog service){

  this . blog service=blog service;

  }

  @覆盖

  public void writeBlog() {

  System.out.println(开始写入.);

  blog service . write blog();

  System.out.println(结束写入.);

  }

  }测试:

  公共类TestStaticProxy {

  公共静态void main(String[] args) {

  IBlogService target=new blog service();

  BlogStaticProxy proxy=new BlogStaticProxy(target);

  proxy . write();

  }

  }开始写……

  我在写…

  结束编写…静态代理,不需要修改目标对象,可以通过代理对象做额外的扩展功能。但是,静态方法不是很灵活。如果修改了目标接口的代码,那么目标对象和代理对象都需要修改。

  动态代理在一定程度上避免了这种情况。动态代理不需要代理对象来实现目标接口,在java虚拟机的内存中动态生成代理对象。

  Jdk动态对象

  Jdk的动态代理由类代理生成,它有三个参数:

  Classloader,指定当前目标对象使用类加载器,获取加载器的方法是固定的。

  班级?[] interfaces:目标对象实现的接口的类型,该类型以通用的方式确认。

  InvocationHandler h:事件处理,当执行目标对象的方法时,会触发事件处理程序的方法,将当前执行的目标对象的方法作为参数传入。

  公共静态对象newProxyInstance(类加载器loader,

  班级?[]接口,

  InvocationHandler h)

  抛出非法数据异常

  {

  }Jdk的动态代理代码如下:

  公共类JdkBlogProxyFactory {

  私有对象目标;

  公共JdkBlogProxyFactory(对象目标){

  目标=目标

  }

  公共对象newInstance() {

  返回代理。newproxyinstance(目标。getclass().getClassLoader()、target.getClass().getInterfaces(),

  (代理、方法、参数)- {

  System.out.println(开始写入);

  Object o=method.invoke(target,args);

  System.out.println(结束写入);

  返回o;

  });

  }

  }测试类:

  公共类TestJdkProxy {

  公共静态void main(String[] args) {

  IBlogService target=new blog service();

  系统。出去。println(目标。getclass());

  //给目标对象,创建代理对象

  IBlogService proxy=(IBlogService)new JdkBlogProxyFactory(target).新实例();

  //类代理0内存中动态生成的代理对象

  系统。出去。println(代理。getclass());

  //执行方法【代理对象】

  代理。写博客();

  }

  }控制台打印如下:

  class com。去ZP。代理。博客服务

  class com.sun.proxy.$Proxy0

  开始写作

  我在写东西.

  结束编写能说会道的动态代理

  字节码生成采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。

  CglibBlogFactory代理工厂类如下:

  公共类CglibBlogFactory实现MethodInterceptor {

  私有对象目标;

  公共CglibBlogFactory(对象目标){

  目标=目标

  }

  //给目标对象创建一个代理对象

  公共对象getProxyInstance() {

  //1.工具类

  增强剂en=新增强子();

  //2.设置父类

  恩。设置超类(目标。getclass());

  //3.设置回调函数

  恩。设置回调(this);

  //4.创建子类(代理对象)

  返回恩。create();

  }

  @覆盖

  公共对象拦截(对象哦,方法方法,对象[]对象,方法代理方法代理)抛出可投掷的

  System.out.println(开始写入.);

  //执行目标对象的方法

  对象返回值=方法。调用(目标、对象);

  System.out.println(结束写入.);

  返回返回值

  }

  }测试类:

  公共类TestCglib {

  公共静态void main(String[] args) {

  IBlogService target=new blog service();

  //代理对象

  IBlogService proxy=(IBlogService)new CglibBlogFactory(target).getProxyInstance();

  //执行代理对象的方法

  代理。写博客();

  }

  }运行程序,控制台打印:

  开始写作.

  我在写东西.

  结束写作.相关推荐:java入门教程以上就是爪哇岛代理模式介绍的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: