Java动态代理实现方法小结

本文实例讲述了Java动态代理实现方法。分享给大家供大家参考,具体如下:

静态代理了解的差不多了,但是对于动态代理理解的还不是很通透,这里先把一些常用的动态代理实现方法记录下来,日后时常看看争取早日融会贯通。

1、JDK实现动态代理

主要使用了Proxy.newProxyInstance()方法,该方法的官方解释为:返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。

public interface ISomeService {
  String doFirst();
  void doSecond();
  String doThird();
}
//目标类:代理类要增强的类
public class SomeServiceImpl implements ISomeService {
  @Override
  public String doFirst() {
    return "AAAbbb";
  }
  @Override
  public void doSecond() {
    System.out.println("SomeServiceImpl:执行doSecond()");
  }
  @Override
  public String doThird() {
    return "aaa";
  }
}
public class Mytest {
  public static void main(String[] args) {
    ISomeService target = new SomeServiceImpl();
    ISomeService someService = (ISomeService) Proxy.newProxyInstance(
        target.getClass().getClassLoader(),
        target.getClass().getInterfaces(),
        new InvocationHandler() {
          // proxy:代理对象
          // method:目标方法
          // args:目标方法的参数列表
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = method.invoke(target, args);
            if(result!=null) {
              result=((String)result).toUpperCase();
            }
            return result;
          }
        });
    System.out.println(someService.doFirst());
    someService.doSecond();
    System.out.println(someService.doThird());
  }
}

2、CGLIB实现动态代理(没接口)

使用JDK的Proxy实现动态代理,要求目标类与代理类实现相同的接口,若目标类不存在接口,则无法使用该方式实现。

对于没有接口的类,要为其创建动态代理,就要使用CGLIB来实现。CGLIB动态代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。使用CGLIB生成代理类,要求目标类必须能被继承,因此不能是final类。

//目标类:代理类要增强的类
public class SomeService {
  public String doFirst() {
    System.out.println("SomeServiceImpl:执行doFirst()");
    return "AAAbbb";
  }
  public void doSecond() {
    System.out.println("SomeServiceImpl:执行doSecond()");
  }
}
//注意:使用Cglib动态代理,要求目标类不能是final的
//Cglib动态代理的增强原理是:子类增强父类,所以目标类必须能被继承
public class CglibFactory implements MethodInterceptor {
  private SomeService target;
  public CglibFactory() { }
  public CglibFactory(SomeService target) {
    this.target = target;
  }
  public SomeService myCglibCreator() {
    Enhancer enhancer = new Enhancer();
    //指定父类,即目标类。因为Cglib动态代理增强的原理是:子类增强父类
    enhancer.setSuperclass(SomeService.class);
    //设置回调接口对象
    enhancer.setCallback(this);
    //create()方法用于创建Cglib动态代理对象
    return (SomeService)enhancer.create();
  }
  //回调函数的执行条件:代理对象执行目标方法时会触发该方法
  @Override
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    Object invoke = method.invoke(target, args);
    if(invoke!=null) {
      invoke=((String)invoke).toUpperCase();
    }
    return invoke;
  }
}
public class Mytest {
  public static void main(String[] args) {
    SomeService target = new SomeService();
    SomeService proxy = new CglibFactory(target).myCglibCreator();
    proxy.doFirst();
  }
}

3、CGLIB实现动态代理(有接口)

在有接口的情况下利用CGLIB实现动态代理跟没有接口的情况下利用CGLIB实现动态代理,其实差不多。

public interface ISomeService {
  String doFirst();
  void doSecond();
  String doThird();
}
//目标类:代理类要增强的类
public class SomeService implements ISomeService {
  public String doFirst() {
    return "AAAbbb";
  }
  public void doSecond() {
    System.out.println("SomeServiceImpl:执行doSecond()");
  }
  @Override
  public String doThird() {
    return "third";
  }
}
//注意:使用Cglib动态代理,要求目标类不能是final的
//Cglib动态代理的增强原理是:子类增强父类,所以目标类必须能被继承
public class CglibFactory implements MethodInterceptor {
  private ISomeService target;
  public CglibFactory() { }
  public CglibFactory(ISomeService target) {
    this.target = target;
  }
  public ISomeService myCglibCreator() {
    Enhancer enhancer = new Enhancer();
    //指定父类,即目标类。因为Cglib动态代理增强的原理是:子类增强父类
    enhancer.setSuperclass(ISomeService.class);
    //设置回调接口对象
    enhancer.setCallback(this);
    //create()方法用于创建Cglib动态代理对象
    return (ISomeService)enhancer.create();
  }
  //回调函数的执行条件:代理对象执行目标方法时会触发该方法
  @Override
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    Object invoke = method.invoke(target, args);
    if(invoke!=null) {
      invoke=((String)invoke).toUpperCase();
    }
    return invoke;
  }
}
public class Mytest {
  public static void main(String[] args) {
    ISomeService target = new SomeService();
    ISomeService proxy = new CglibFactory(target).myCglibCreator();
    System.out.println(proxy.doFirst());
    proxy.doSecond();
    System.out.println(proxy.doThird());
  }
}

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • 深入学习Java 动态代理

    前言 要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式. 在我看来所谓的代理模式,和23种设计模式中的"装饰模式"是一个东西.23种设计模式中将它们作为两种模式,网上也有些文章讲这两种模式的异同,从细节来看,确实可以人为地区分这两种模式,但是抽象到一定高度后,我认为这两种模式是完全一样的.因此学会了代理模式,也就同时掌握了装饰模式. 代理模式

  • 详解JAVA动态代理

    文档更新说明 2018年09月24日 v1.0 初稿 代理在生活中很常见,比如说婚介网站,其实就是找对象的代理:还有社保代理.人事代理:还有找黄牛抢票,其实也是一种代理:而这些代理,在JAVA中也是有对应实现的. 1.为什么要动态代理 动态代理的作用其实就是在不修改原代码的前提下,对已有的方法进行增强. 关键点: 不修改原来已有的代码(满足设计模式的要求) 对已有方法进行增强 2.举个栗子 我们用一个很简单的例子来说明:Hello类,有一个introduction方法. 现在我们的需求就是不修改

  • 实例讲解Java中动态代理和反射机制

    反射机制 Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法.属性和构造方法等. 动态代理:分为JDK动态代理.cglib动态代理(spring中的动态代理). 静态代理 预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 动态代理 代理类在程序运行时创建的代理方式.也就是说,代理类并不是在Java代码中定义的,而是在运行期间根据我们在Java代码中的"指示"动态生成的. 动态代理比

  • Java动态代理和反射机制详解

    反射机制 Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法.属性和构造方法等. 动态代理:分为JDK动态代理.cglib动态代理(spring中的动态代理). 静态代理 预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理 动态代理 代理类在程序运行时创建的代理方式.也就是说,代理类并不是在Java代码中定义的,而是在运行期间根据我们在Java代码中的"指示"动态生成的. 动态代理比

  • Java动态代理的两种实现方式详解【附相关jar文件下载】

    本文实例讲述了Java动态代理的两种实现方式.分享给大家供大家参考,具体如下: 一说到动态代理,我们第一个想到肯定是大名鼎鼎的Spring AOP了.在AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理.两种方法同时存在,各有优劣.jdk动态代理是由java内部的反射机制来实现的,cglib动态代理是通过继承来实现的,底层则是借助asm(Java 字节码操控框架)来实现的(采用字节码的方式,给A类创建一个子类B,子类B使用方法拦截的技术拦截所以父类的方法调用)

  • Java动态代理实现方法小结

    本文实例讲述了Java动态代理实现方法.分享给大家供大家参考,具体如下: 静态代理了解的差不多了,但是对于动态代理理解的还不是很通透,这里先把一些常用的动态代理实现方法记录下来,日后时常看看争取早日融会贯通. 1.JDK实现动态代理 主要使用了Proxy.newProxyInstance()方法,该方法的官方解释为:返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序. public interface ISomeService { String doFirst(); vo

  • java 动态代理的方法总结

    java 动态代理的方法总结 AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行.不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等). 那么动态代理是如何实现将切面逻辑(advise)织入到目标类

  • 代理模式之Java动态代理实现方法

    今天一个偶然的机会我突然想看看JDK的动态代理,因为以前也知道一点,而且只是简单的想测试一下使用,使用很快里就写好了这么几个接口和类:接口类:UserService.java 复制代码 代码如下: package com.yixi.proxy;public interface UserService {    public int save() ;    public void update(int id);} 实现类:UserServiceImpl.java 复制代码 代码如下: packag

  • Java 动态代理原理分析

    Java 动态代理原理分析 概要 AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行.Spring中的动态代理是使用Cglib进行实现的.我们这里分析的是JDK中的动态代理实现机制. 下面我们通过例子快速了解JDK中的动态代理实现方式. 示例 需要代理的接口 public interface IHello { public void sayHel

  • 详解java动态代理模式

    本文针对java动态代理进行知识点整理,具体内容如下 一. JAVA的动态代理(比较官方说法) 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提 供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工

  • Java动态代理实现_动力节点Java学院整理

    动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较为高级的代理模式,它在事务管理.AOP(Aspect-Ori

  • JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个类. InvocationHandler类 public Object invoke(Object obj,Method method,Object[] obs) 其中第一个参数 obj 指的是代理类,method是被代理的方法,obs是指被代理的方法的参数组.此方法由代理类来实现. Proxy类

  • Java 动态代理与CGLIB详细介绍

    静态代理模式 因为需要对一些函数进行二次处理,或是某些函数不让外界知道时,可以使用代理模式,通过访问第三方,间接访问原函数的方式,达到以上目的. interface Hosee{ String sayhi(); } class Hoseeimpl implements Hosee{ @Override public String sayhi() { return "Welcome oschina hosee's blog"; } } class HoseeProxy implement

  • Java动态代理分析及理解

    Java动态代理分析及理解 代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Subject { public void doSomething(); } public class RealSubject implements Subject { public void doSomething() { System.out.println( "call

  • 详解Java动态代理的实现及应用

    详解Java动态代理的实现及应用 Java动态代理其实写日常业务代码是不常用的,但在框架层一起RPC框架的客户端是非常常见及重要的.spring的核心思想aop的底层原理实现就使用到了java的动态代理技术. 使用代理可以实现对象的远程调用以及aop的实现. java的动态代理的实现,主要依赖InvoctionHandler(接口)和Proxy(类)这两个. 下面是一个例子 实现的代理的一般需要有个接口 package com.yasin.ProxyLearn; public interface

随机推荐