`

动态静态代理 jdk cglib

 
阅读更多
  • 静态代理

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

原理:

对普通一个接口与一直实现类在加入一个代理类,用于包装实现类中实现的方法,而业务使用方只需要实例化代理类,并传递需要代理的普通类即可。

优点:

编译时生成代码,性能高

缺点:

  1. 一个代理类只能为一个接口服务,开发中必然会产生过多的代理

  2. 所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码

代码示例

/**
 * 通过代理类,实现代理接口,通过构造进行实现的代理,在每个方法里面进行日志捕获
 * <pre>
 * 外部实现权限验证的时候,只需要之所想该方法即可,不需要再去实现UserImpl方法了
 * <pre>
 */
public class UserProxy implements IUser {
  private UserImpl userImpl;
  // 构造的时候直接传入代理实现类
  public UserProxy(UserImpl userImpl) {
    super();
    this.setUserImpl(userImpl);
  }
  @Override
  public boolean isAuthUser(int uid) {
    System.out.println("proxy insert msg:准备权限验证,有必要这里可以发送消息到MQ,做实时登录验证次数预警处理");
    boolean b = userImpl.isAuthUser(uid);
    System.out.println("proxy insert msg:验证完成,做一些清理等工作.....");
    return b;
  }
  // ***********get,set************
  public UserImpl getUserImpl() {
    return userImpl;
  }
  public void setUserImpl(UserImpl userImpl) {
    this.userImpl = userImpl;
  }
}
 public static void main(String[] args) {
    UserProxy userProxy = new UserProxy(new UserImpl());
    userProxy.isAuthUser(5);
  }

 

  • 动态代理

原理:

动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。

优点

可以通过一个代理类,完成所有代理工作,不需要向静态代理需要一个一个实现接口来代理

缺点

通过反射动态代理方法将消耗系统性能,如果非常多的话,性能比较低

JDK动态代理

原理:JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
/**
 * JDK动态代理代理类,可以将InvocationHandler接口的子类想象成一个代理的最终操作类 
 * JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这个也是缺陷
 * @author Jason
 *
 */
public class UserJDKProxy implements InvocationHandler {
 
  // 需要代理的类
  private Object target;
 
   
   
  public UserJDKProxy() {
     super();
  }
 
  /**
  * 绑定委托对象并返回一个代理类 ClassLoader loader:类加载器 Class<?>[] interfaces:得到全部的接口 InvocationHandler
  * h:得到InvocationHandler接口的子类实例
  * 
  * @param target
  * @return
  */
  public Object initUserJDKProxy(Object target) {
     this.target = target;
     // 可以看出这里的第二个参数是获取接口,那么也就是说我们实现代理,需要类去实现接口,在有的时候,类是没有接口的,所以这里是一个缺陷
     return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
  }
 
  /**
  * 调用具体的方法
  * 
  * @param proxy
  *           指被代理的对象
  * @param method
  *           要调用的方法
  * @param args
  *           方法调用时所需要的参数
  * @return
  * @throws Throwable
  */
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
     System.out.println("proxy:这里拦截处理一下事情....,如监控参数、插入日志....");
     //传入处理对象和参数
     Object object = method.invoke(target, args);
     System.out.println("proxy:这里做一些收尾工作....");
     return object;
  }
 
}

UserJDKProxy userJDKProxy=new UserJDKProxy();
IUser iUser=(IUser) userJDKProxy.initUserJDKProxy(new UserImpl());
iUser.isAuthUser(19);

 

CGLib动态代理

原理:cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
 * 采用CGLib方式动态代理类
 * @author Jason
 *
 */
public class UserCglibProxy implements MethodInterceptor {
  private Object target;
  public Object getInstance(Object target) {
    this.target = target;
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(target.getClass());
    //回调方法  
    enhancer.setCallback(this);
    //创建代理对象  
    return enhancer.create();
  }
  // 回调方法
  @Override
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    System.out.println("可以做一些监控、预警等工作...");
    Object object = proxy.invokeSuper(obj, args);
    System.out.println("收尾工作....");
    return object;
  }
}

UserCglibProxy userCglibProxy=new UserCglibProxy();
UserImpl userImpl=(UserImpl) userCglibProxy.getInstance(new UserImpl());
userImpl.isAuthUser(50);

 

分享到:
评论

相关推荐

    java代理机制 JDK动态代理和cglib代理 详解

    - `Proxy`类是JDK动态代理的工厂,它提供静态方法`newProxyInstance()`用于创建代理对象。 - 创建代理对象需要三个参数:类加载器、目标接口数组和InvocationHandler实例。 二、CGLIB代理 CGLIB(Code Generation...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...

    静态代理、jdk动态代理、cglib动态代理

    静态代理的实现方式是:在编译时,创建一个代理类,该代理类继承自被代理的对象,并重写其中的一些方法,以便控制对被代理对象的访问。 静态代理的优点是:它的实现方式简单易懂,易于维护和扩展。但是,它的缺点是...

    Jdk动态代理和cglib动态代理原理

    动态代理主要分为两种技术:JDK动态代理和CGLIB动态代理。 ### JDK动态代理 JDK动态代理是Java内置的一种机制,依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。以下是JDK动态...

    JAVA JDK静态代理、动态代理、CGlib代理的代码演示

    Java提供了两种主要的代理实现方式:JDK静态代理和动态代理,另外还有第三方库如CGlib提供的代理实现。下面我们将详细探讨这些代理技术,并通过代码演示来理解它们的工作原理。 ### 1. JDK静态代理 静态代理是我们...

    java动态代理(JDK和cglib).pdf

    `CountProxy`是静态代理类,它也实现了`Count`接口,但添加了额外的逻辑,如事务处理。在JDK动态代理中,我们可以通过`Proxy.newProxyInstance()`方法创建代理对象,传入`ClassLoader`、接口列表和`...

    jdk动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....

    Java动态代理(JDK和cglib)

    根据代理对象创建的时间不同,代理又可分为静态代理和动态代理两种类型。 #### 二、静态代理 静态代理是指在程序运行前,代理类的`.class`文件就已经存在的情况。具体来说,静态代理需要程序员事先手动编写代理类...

    Java JDK代理、CGLIB、AspectJ代理分析比较

    代理模式分为两大类:静态代理和动态代理。 - **静态代理**:在程序运行前代理类就已经被定义好,并且代理类与委托类之间的关系在编译期间就已经固定下来。这意味着我们需要为每一个需要代理的方法都实现一个代理类...

    java动态代理(JDK和cglib)共10页.pdf.z

    动态代理主要分为两种实现方式:JDK动态代理和CGLIB代理。 **JDK动态代理:** JDK动态代理基于Java反射API实现,它依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于...

    代理模式(Proxy Pattern) 1. 概述 1.1 基本概念 1.2 为什么需要代理模式 1.3 代理模式的四个角色 2. 代理模式的类型 2.1 静态代理 2.2 JDK动态代理

    2.1 静态代理 2.2 JDK动态代理 2.3 CGLIB动态代理 3. 代理模式的UML类图和基本实现 3.1 UML类图 3.2 基本实现 3.2.1 静态代理基本实现 3.2.2 JDK动态代理基本实现 3.2.3 CGLIB动态代理基本实现 3.3 三种代理方式的...

    输出JDK和CGLib动态代理产生的class文件.zip

    本压缩包文件提供了两个示例项目,分别展示了JDK动态代理和CGLib动态代理的实现,帮助我们理解这两种技术的工作原理以及它们生成的class文件结构。 首先,我们来详细了解JDK动态代理。JDK动态代理基于Java的接口...

    java动态代理(JDK和cglib).docx

    相比静态代理,JDK动态代理的优点在于可以为任意数量的接口生成代理对象,避免了大量重复的代理类代码。同时,它更灵活,可以在运行时决定代理的行为,比如根据不同的条件动态改变增强策略。 CGLIB(Code ...

    静态代理动态代理测试,模拟jdk实现动态代理

    代理模式分为静态代理和动态代理两种主要形式。 **静态代理**是程序员手动创建代理类,这个代理类与真实被代理的对象(目标对象)实现相同的接口。代理类在调用目标对象方法时,可以加入额外的操作,如日志记录、...

    你必须会的 JDK 动态代理和 CGLIB 动态代理

    本文将探讨静态代理、JDK动态代理以及CGLIB动态代理的区别和应用场景。 **静态代理** 静态代理是在编译阶段就已经确定的代理模式,代理类的字节码在程序运行前就已经生成。在静态代理中,代理类和目标类通常实现...

    cglib代理资料类,静态代理动态代理

    以上就是关于静态代理、动态代理(JDK)和CGlib代理的基本介绍。它们在Java开发中都有广泛的应用,尤其是在AOP(面向切面编程)和框架设计中,如Spring AOP就使用了这两种代理技术。了解并熟练掌握这些代理机制,...

    cglib aop spring 动态代理

    静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一...

Global site tag (gtag.js) - Google Analytics