`

动态静态代理 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)共10页.pdf.z

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

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

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

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

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

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

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

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

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

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

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

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

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

    cglib aop spring 动态代理

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

    代理模式的各种实现 (动态代理、静态代理)

    代理模式在Java中主要有两种实现方式:静态代理和动态代理,其中动态代理又分为JDK动态代理和CGlib代理。 1. 静态代理 静态代理是程序员手动创建代理类并实现与目标类相同接口的方式。在静态代理中,代理类和目标类...

Global site tag (gtag.js) - Google Analytics