SpringAop基于动态代理

动态代理如下图所示
在这里插入图片描述
动态代理举例

package com.web.proxy;

public interface Hello {

	public void sayHi(String name);
	
}

package com.web.proxy;

public class HelloImpl implements Hello{

	@Override
	public void sayHi(String name) {
		System.out.println(name+"你好帅啊!!");
	}
	
}

package com.web.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 代理类
 * @author Administrator
 *
 */
public class HelloHandler implements InvocationHandler{

	//被代理的对象
	private Object obj;
	//构造方法初始化对象
	public HelloHandler(Object obj){
		this.obj = obj;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		before();//为代理的方法添加功能
		//调用原始类中的方法
		Object o = method.invoke(obj, args);
		after();//为代理的方法添加功能
		return o;
	}
	
	public void before(){
		System.out.println("log start...");
	}
	
	public void after(){
		System.out.println("log end...");
	}
	

	
	
}

package com.web.proxy;

import java.lang.reflect.Proxy;

public class Test {

	public static void main(String[] args) {
		
		HelloImpl hi = new HelloImpl();
		
		HelloHandler hh = new HelloHandler(hi);
		
		Hello h = (Hello) Proxy.newProxyInstance(hi.getClass().getClassLoader(), hi.getClass().getInterfaces(), hh);
		
		h.sayHi("张三");
		
	}
	
}

个人理解:首先由接口Hello,方法sayHi,(假设类A),然后HelloImpl实现Hello接口重写sayHi方法(假设类B),然后有Hello的代理类HelloHander实现了InvocationHandler接口(类C),通过构造方法传入对象,重写了invoke方法,此时类C为类B的代理类,那么在Test类中,首先创建了类B的实例,然后在类C的构造方法中传入该类B实例,表示为类B的代理类,再通过Proxy的静态方法newProxyInstance分别传入类B的构造器,类B的接所实现的接口,以及类C的实例,返回一个类A的对象,最终调用的方法便是类B的Invoke中的方法,实现动态代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值