`
tangyiss
  • 浏览: 7133 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java 动态代理 CGLIB AOP基础

    博客分类:
  • Java
 
阅读更多

什么是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

 

分享到:
评论

相关推荐

    Java动态代理CGlib Jar包

    CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和...EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类进行代理。

    Java 动态代理和Cglib代理(二)

    在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...

    cglib aop spring 动态代理

    jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口,则没办法代理这个类。 cglib代理, 1.cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在...

    基于Java动态代理的AOP实现.zip

    本项目旨在通过Java的动态代理技术实现面向切面编程(AOP),涵盖了静态代理、JDK动态代理、CGLIB动态代理、AspectJ以及基于instrumentation的动态代理等多种实现方式。通过这些实现方式,可以在不修改原有代码的...

    动态代理和AOP详解

    动态代理和AOP是Java和Spring框架中的重要概念,它们为开发者提供了强大的代码复用和模块化设计的能力。本文将深入解析这两个主题,并结合提供的源码进行详细讲解。 首先,让我们了解一下动态代理。在Java中,动态...

    AOP之JDK动态代理和CGLib动态代理

    Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...

    java动态代理和cglib动态代理示例分享共5页.pdf

    Java动态代理和CGLIB动态代理是两种在Java开发中常用的面向切面编程(AOP)技术,主要用于在运行时创建具有额外功能的对象。这两者都允许我们在不修改原有代码的情况下,为对象添加额外的行为,如日志记录、事务管理...

    Java动态代理(Spring Aop原理)

    在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如日志、事务管理等。这篇博客的文章链接虽然没有给出具体内容,但我们可以根据Java动态代理和Spring AOP的基本概念来深入...

    浅谈JDK动态代理与CGLIB代理去区别

    在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...

    java分页 动态代理 aop实现

    本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...

    cglib动态代理

    总结起来,CGLib动态代理是Java开发中的一个重要工具,它通过字节码技术为不支持接口的类提供代理能力,广泛应用于AOP、测试等场景。了解并掌握CGLib,能够帮助开发者更好地理解和利用Java的动态性,提高代码的灵活...

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

    Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解对象获取、日志、用户鉴权、全局性异常处理、性能监控等领域。...

    java-用Java动态代理实现AOP.pdf

    在Java中,动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标类实现有接口的情况;而CGLIB则是在运行时生成目标类的子类,适用于目标类没有接口或对性能要求较高的场景。...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

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

    ### Java代理技术详解:JDK代理、CGLIB与AspectJ #### 一、代理模式简介 代理模式是一种常见的设计模式,在《Design Patterns in Java》一书中对其有明确的定义:“代理模式为一个对象提供一个代理,以控制对该...

    示例代码:java动态代理和cglib代理的简单例子

    Java动态代理和CGLIB代理是两种常用的在Java中实现面向切面编程(AOP)的技术,它们允许我们在不修改原有代码的情况下,为方法添加额外的功能,如日志记录、性能监控、事务管理等。本篇文章将深入探讨这两种代理机制...

    使用cglib演示动态代理时用到的jar包 aop 动态代理

    动态代理是实现AOP的一种方式,而在Java中,CGLIB(Code Generation Library)是一个常用的库,专门用于创建子类动态代理。下面我们将详细探讨AOP、动态代理以及CGLIB的相关知识点。 首先,AOP的核心概念是“切面”...

    Spring框架中JDK动态代理和cglib动态代理

    Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...

    jdk动态代理 cglib3.0动态代理

    JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作原理。 **JDK动态代理** JDK动态代理基于Java反射API实现,它提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....

Global site tag (gtag.js) - Google Analytics