什么是java动态代理?先说说静态代理吧,在程序运行之前就编译好的代理类,动态代理就是运行时生成搞些小动作。举个不恰当的例子:本来去学校读书,父母希望是专心听老师讲课(静态代理),但坐在教室心里总想着那个ta,传纸条,谈朋友等,结果课也上好了,朋友也谈了,多美好的事。
由Java的反射机制完成,也是学习spring的基础。
不多说,下面代码片段将实现一个计算器的日志,用代理实现。
/** * 接口 * @author tangyi */ public interface ICaclulator { @Deprecated int add(int i, int j); int sub(int i, int j); int mul(int i, int j); int dev(int i, int j); }
/** * 接口实现类 具体业务方法 * @author tangyi */ public class CaclulatorImpl implements ICaclulator { @Override public int add(int i, int j) { int result = i + j; return result; } @Override public int sub(int i, int j) { int result = i - j; return result; } @Override public int mul(int i, int j) { int result = i * j; return result; } @Override public int dev(int i, int j) { int result = i / j; return result; } }
/** * @see 日志代理类 * @author tangyi * */ public class CaclulatorLogProxy { private ICaclulator target; /** * 构造器 */ public CaclulatorLogProxy(ICaclulator target) { this.target = target; } public Object getLoggingProxy(){ ICaclulator proxy = null; //代理类的类加载器 ClassLoader loader = target.getClass().getClassLoader(); //代理对象类型 Class[] interfaces = new Class[]{ICaclulator.class}; //当调用代理对象中的方法时 InvocationHandler h = new InvocationHandler() { /** * proxy:正在返回的那个代理对象; * method:正在被调用的方法; * args:调用方法时,传入的参数; */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName = method.getName(); System.out.println("The method " + methodName + " begin with " + Arrays.asList(args)); Object result = method.invoke(target, args); System.out.println("The method " + methodName + " end with " + result); return result; } }; return Proxy.newProxyInstance(loader, interfaces, h); } }
** * @author tangyi * */ public class Main { public static void main(String[] args) { ICaclulator target = new CaclulatorImpl(); ICaclulator proxy = (ICaclulator) new CaclulatorLogProxy(target).getLoggingProxy(); System.out.println(proxy.getClass().getName()); int result = proxy.add(1, 2); System.out.println("-->>" + result); result = proxy.sub(4, 2); System.out.println("-->>" + result); } }
测试结果:
com.sun.proxy.$Proxy0 The method add begin with [1, 2] The method add end with 3 -->>3 The method sub begin with [4, 2] The method sub end with 2 -->>2
相关推荐
CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和...EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类进行代理。
在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...
jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...
本项目旨在通过Java的动态代理技术实现面向切面编程(AOP),涵盖了静态代理、JDK动态代理、CGLIB动态代理、AspectJ以及基于instrumentation的动态代理等多种实现方式。通过这些实现方式,可以在不修改原有代码的...
动态代理和AOP是Java和Spring框架中的重要概念,它们为开发者提供了强大的代码复用和模块化设计的能力。本文将深入解析这两个主题,并结合提供的源码进行详细讲解。 首先,让我们了解一下动态代理。在Java中,动态...
Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...
Java动态代理和CGLIB动态代理是两种在Java开发中常用的面向切面编程(AOP)技术,主要用于在运行时创建具有额外功能的对象。这两者都允许我们在不修改原有代码的情况下,为对象添加额外的行为,如日志记录、事务管理...
在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...
在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...
本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...
总结起来,CGLib动态代理是Java开发中的一个重要工具,它通过字节码技术为不支持接口的类提供代理能力,广泛应用于AOP、测试等场景。了解并掌握CGLib,能够帮助开发者更好地理解和利用Java的动态性,提高代码的灵活...
Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解对象获取、日志、用户鉴权、全局性异常处理、性能监控等领域。...
在Java中,动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标类实现有接口的情况;而CGLIB则是在运行时生成目标类的子类,适用于目标类没有接口或对性能要求较高的场景。...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
### Java代理技术详解:JDK代理、CGLIB与AspectJ #### 一、代理模式简介 代理模式是一种常见的设计模式,在《Design Patterns in Java》一书中对其有明确的定义:“代理模式为一个对象提供一个代理,以控制对该...
Java动态代理和CGLIB代理是两种常用的在Java中实现面向切面编程(AOP)的技术,它们允许我们在不修改原有代码的情况下,为方法添加额外的功能,如日志记录、性能监控、事务管理等。本篇文章将深入探讨这两种代理机制...
动态代理是实现AOP的一种方式,而在Java中,CGLIB(Code Generation Library)是一个常用的库,专门用于创建子类动态代理。下面我们将详细探讨AOP、动态代理以及CGLIB的相关知识点。 首先,AOP的核心概念是“切面”...
Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...
JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作原理。 **JDK动态代理** JDK动态代理基于Java反射API实现,它提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....