文档章节

java --动态代理之AOP

求是科技
 求是科技
发布于 2016/10/06 10:08
字数 377
阅读 12
收藏 0

#1测试类

/**
 * 动态代理之AOP
 */
public class TestAOP {
	
	public static void main(String[] args) {
		//1.创建一个被代理类
		SuperMan sm = new SuperMan();
		//2.返回一个动态代理类
		Object obj =MyProxy.getProxyInstance(sm);
		//3.转换
		Human hm = (Human) obj;
		//4.调用方法
		hm.info();
		//换行
		System.out.println("==================");
		//5.调用方法
		hm.fly();
	}
}

#2.接口

//接口
interface Human{
	void info();
	void fly();
}

#3.被代理类

//被代理类
class SuperMan implements Human{

	@Override
	public void info() {
		System.out.println("我是超人");
	}

	@Override
	public void fly() {
		System.out.println("我能飞");
	}
}

#4.两个固定模块

//提供两个固定方法
//需求:在这两个方法之间动态的插入一个方法
class HumanUtil{
	public void method1(){
		System.out.println("-----方法1------");
	}
	public void method2(){
		System.out.println("-----方法2------");
	}
}

#5.代理类实现方法

//代理类实现方法
class MyInvocation implements InvocationHandler{

	//被代理对象的声明
	Object obj;
	
/*	//方法1:给代理对象赋值,通过set方法
	public void setObject(Object obj) {
		this.obj = obj;
	}*/
	//方法2:给代理对象赋值,通过构造器
	public MyInvocation(Object obj) {
		this.obj = obj;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		
		/**
		 * 需求:在如上提供的两个方法之间动态插入一个方法
		 */
		HumanUtil humanUtil = new HumanUtil();
		//1.调用方法1
		humanUtil.method1();
		//2.插入动态方法
		//这里实际调用的是被代理类要执行的方法(即动态的方法)
		Object returnVal = method.invoke(obj, args);
		//3.调用方法2
		humanUtil.method2();
		return returnVal;
	}
}

#6.动态的创建一个代理类的对象

//动态的创建一个代理类的对象
class MyProxy{
	public static Object getProxyInstance(Object obj){
		MyInvocation handler = new MyInvocation(obj);
		//handler.setObject(obj);
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
	}
}

© 著作权归作者所有

共有 人打赏支持
求是科技
粉丝 90
博文 438
码字总数 225859
作品 0
成都
后端工程师
3.2 Spring AOP的设计与实现

JVM的动态代理特性 在Spring AOP实现中,使用的核心技术是动态代理,这实际上是JDK的一个特性(JDK1.3以上的版本有这个特性)。通过JDK的动态代理特性,可以为任意Java对象创建代理对象,对于...

edwardGe
05/30
0
0
Spring的事务管理难点剖析(6):特殊方法成漏网之鱼

由于Spring事务管理是基于接口代理或动态字节码技术,通过AOP实施事务增强的。虽然Spring还支持AspectJ LTW在类加载期实施增强,但这种方法很少使用,所以我们不予关注。 对于基于接口动态代...

icheer
2012/07/17
0
0
Spring AOP 实现原理与 CGLIB 应用

AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架...

只想一个人静一静
2014/02/27
0
0
cglib代理和java自带代理的区别

一 动态代理主要有java自带的代理和cglib方式实现的代理 首先讲下java自带的代理 ------------------然后是cglib自带的代理------------------------- 测试类: java动态代理是利用反射机制生...

sen_ye
07/15
0
0
Spring AOP 实现原理与 CGLIB 应用

AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 AOP 框架...

ihaolin
2014/03/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之声明合并(一)

转发 TypeScript基础入门之声明合并(一) 声明合并 介绍 TypeScript中的一些独特概念描述了类型级别的JavaScript对象的形状。 TypeScript特别独特的一个例子是"声明合并"的概念。 在使用现有J...

durban
12分钟前
1
0
Mysql-db

aptitude install default-libmysqlclient-dev pip install mysql-python

dragon_tech
17分钟前
1
0
函数装饰器

def debug(func): def wrapper(*args, **kwargs): # 多个参数# def wrapper(something): # 指定一样的参数 print("[DEBUG]: enter {}()".format(func.__name__)) ......

colin_86
19分钟前
1
0
Notification-状态栏上的通知

当程序并不是出在运行状态的时候,可以调用Notification来显示通知。 1、创建 Notification的创建主要涉及到三个类:NotificationManager,Notification和PendingIntent NotificationManager主...

西米小娅
22分钟前
1
0
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource c

spring boot启动报错: Description: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determin......

wenzhizhon
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部