使用JDK中的Proxy技术来实现动态代理

我举个例子来说明一下代理的原理:

现实生活的例子:我大学放假了,我想要去放松一下去海洋馆买个门票,我看见海洋馆门前坐个人,看起来就是卖票的,于是,我上他那去买票,于是,他出去一下说给我拿票来,在他去拿票的过程中又去找了另外一个人,那个人把票给他了,他把票给我了,可是在这个过程中我却什么都不知道,我知道我要拿票,他把票给我就ok了。

java中的例子:客户端用一个接口引用一个对象,然后用这个=接口去调用一些方法,表面上我只看到了这个接口的引用,而程序在运行的时候找的却是具体的对象,这就是多态,所以我完全可以将这个对象掉包,从而在里面做一些手脚,例如日志记录,性能统计,安全控制,事务处理,异常处理等。下面,这个例子就用代理技术对ArrayList这个类做了点手脚。

public class ArrayListProxy {

	private Object target;

	public Object getTarget() {
		return target;
	}

	public Object createProxy(Object target) {
		this.target = target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler(){

			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				System.out.println("小样,我是病毒,今天我就要阻止你了,爱咋咋地");
				Object result = method.invoke(getTarget(), args);
				return result;
			}
		});
	}
}

下面是测试类:

public class ProxyTest {

	@Test
	public void testProxy() {
		Collection con = (Collection) new ArrayListProxy().createProxy(new ArrayList());
		addElement(con);
	}

	public void addElement(Collection con) {
		boolean flag = con.add("我要在这个集合里面添加元素,谁也拦不住,哈哈哈!!!");
		System.out.println(flag);
	}
}

我们本来是想在集合里面添加元素,而在添加之前可以加入一些我们想要的代码,从而达到我们的目的。Spring中的Aop技术基本的原理也是这样实现的,这种方式委托类必须要有接口才可以,如果没有接口的话是行不通的,但是我们可以用cglib,他会继承这个委托类,基本原理也没有多大区别。

时间: 2024-10-11 12:28:57

使用JDK中的Proxy技术来实现动态代理的相关文章

浅谈java中内置的观察者模式与动态代理的实现

一.关于观察者模式 1.将观察者与被观察者分离开来,当被观察者发生变化时,将通知所有观察者,观察者会根据这些变化做出对应的处理. 2.jdk里已经提供对应的Observer接口(观察者接口)与Observable(被观察者类)用于实现观察者模式 3.关于Observer接口,该接口只有一个update方法,当被观察者发生相关变化时,会通知所有的观察者,观察者接受到通知时,调用update方法进行处理.贴出源代码: 1 /* 2 * Copyright (c) 1994, 1998, Oracle

基于JDK的动态代理技术详解

虽然对于Spring的基本思想Aop是基于动态代理和CGlib这一点很早就有所认识,但是什么是动态代理却不甚清楚.为了对Spring加深理解,我觉得好好学习一下java的动态代理是非常有必要的. 静态代理 在学习动态代理之前我先花一点时间了解一下静态代理,从静态代理出发了解代理到底是怎么一回事,以及了解静态代理的局限性,进而明白为什么要发展及使用动态代理技术. 相信使用过Spring框架的同学都知道Spring利用Aop完成声明式事务管理以及其他的代理增强,也就是在方法执行前后加上一些譬如时间.

Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例. 如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类. JDK动态代理具体实现原理: 通过实现InvocationHandlet接口创建自己的调用处理器: 通过为Proxy类指定ClassLoader对象和一组in

SpringBoot中使用LoadTimeWeaving技术实现AOP功能

目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现AOP的例子 3. 参考资料 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 AOP--面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强.按切面被织如到目标类中的时间划分,主要有以下几种: 1.运行期织入 这是最常见的,比如在运行期通过为目标类生成动态代理

设计模式 - 动态代理原理及模仿JDK Proxy 写一个属于自己的动态代理

本篇文章代码内容较多,讲的可能会有些粗糙,大家可以选择性阅读. 本篇文章的目的是简单的分析动态代理的原理及模仿JDK Proxy手写一个动态代理以及对几种代理做一个总结. 对于代理模式的介绍和讲解,网上已经有很多优质的文章,我这里就不会再过多的介绍了,这里推荐几篇优质的文章作为参考: 给女朋友讲解什么是代理模式 轻松学,Java 中的代理模式及动态代理 另外,我的 github 仓库对应目录中也有相关的基础示例代码:https://github.com/eamonzzz/java-advance

Java进阶之 JDK动态代理与Cglib动态代理

一.动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式[Proxy Pattern]), 动态代理类的字节码是在程序运行时由Java反射机制动态生成. 注意: 1.AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理 2.Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于AspectJ较差 二.JDK动态代理 [对有实现接口的对象做代理] 1.JDK动态代理中 需要了解的

JDK动态代理和CGLIB动态代理

转载自http://www.itzhai.com/java-dong-tai-dai-li-zhi-jdk-dong-tai-dai-li-he-cglib-dong-tai-dai-li-mian-xiang-qie-mian-bian-cheng-aop-yuan-li.html 静态代理 静态代理相对来说比较简单,无非就是聚合+多态: 参考:设计模式笔记 – Proxy 代理模式 (Design Pattern) 动态代理 我们知道,通过使用代理,可以在被代理的类的方法的前后添加一些处理方

JDK动态代理和CGLIB动态代理+源码下载

在上一篇文章-java代理详解讲解实现机制,一种是继承另外一种是组合,而且通过做实现也证明使用组合的方式更加的灵活.之后提到了代理的两种种类,一种是静态代理,另外一种是动态代理.上一篇文件中着重介绍的是静态代理(相对于动态代理很容易理解).这一片文章就接着介绍动态代理. 动态代理实现的最终效果:通过以一个统一的方式实现对任意的接口/类的代理.相比较静态代理而言,我们可以不用再无限制的增加代理类,不用再写许多重复的代码.很符合面向对象设计原则中的"开闭原则":对修改关闭,对扩展开放. 动

CGLib与JDK的动态代理

一.CGLib 简介 CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口.Hibernate用它来实现PO字节码的动态生成.CGLib比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法. CGLib 的底层是Java字节码操作框架 -- ASM.CGLib就是封装了ASM,简化了ASM的操作,实现了在运行期动态生