AOP之动态代理

文件结构和jar包(记得build Path)

MathI接口

package com.atguigu.proxy;

public interface MathI {
	int add(int i,int j);
	int sub(int i,int j);
	int mul(int i,int j);
	int div(int i,int j);

}

MathImpl类

package com.atguigu.proxy;

public class MathImpl implements MathI {

	@Override
	public int add(int i, int j) {
//		System.out.println("method:add,arguments:"+i+","+j);
		int result=i+j;
		// TODO Auto-generated method stub
		return result;
	}

	@Override
	public int sub(int i, int j) {
		int result=i-j;
		// TODO Auto-generated method stub
		return result;
	}

	@Override
	public int mul(int i, int j) {
		int result=i*j;
		// TODO Auto-generated method stub
		return result;
	}

	@Override
	public int div(int i, int j) {
		int result=i/j;
		// TODO Auto-generated method stub
		return result;
	}

}

 MyLogger日志类

package com.atguigu.proxy;

public class MyLogger {
	public static void before(String methodName, String args) {
		System.out.println("method:" + methodName + ",arguments:" + args);
	}

	public static void after(String methodName, String result) {
		System.out.println("method:" + methodName + ",arguments:" + result);
	}
	public static void throwing(){
		System.out.println("有异常了。。。。。。");
	}

}

代理执行类

package com.atguigu.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyUtil {
	private MathImpl mathImpl; // 目标对象(必须要有接口) 应该用Object暂时用MathImpl便于理解

	public ProxyUtil(MathImpl mathImpl) {
		super();
		this.mathImpl = mathImpl;
	}

	public Object getProxy() { // 代理对象 this 代表当前类

		// 获取当前类的类加载器 用来加载代理对象所属类
		ClassLoader loader = this.getClass().getClassLoader();

		// 获取目标对象所实现的所有接口的Class对象, 代理类会和目标类实现相同的接口,最终通过代理对象实现功能
		Class[] interfaces = mathImpl.getClass().getInterfaces();
		return Proxy.newProxyInstance(loader, interfaces,
				new InvocationHandler() {

					// invoke代表执行 代理对象中跟目标对象实现相同接口所产生的方法
					@Override
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {

						// TODO Auto-generated method stub
						// args代表方法执行时的参数 Object[] args代表的就是参数
						try {
							MyLogger.before(method.getName(),
									Arrays.toString(args));
							Object result = method.invoke(mathImpl, args); // 动态代理对象实现功能
							MyLogger.after(method.getName(), result.toString());
						    return result;
						} catch (Exception e) {
							MyLogger.throwing();
							e.printStackTrace(); // 将异常信息打印到控制台
						}finally{
							System.out.println("哪都有我");
						}

						return null;
					}
				});
	}
}

测试类

package com.atguigu.proxy;

public class Test {
	public static void main(String[] args) {

		/*
		 * 自己调用
		 * MathI math=new MathImpl(); 
		 * int result =math.add(1, 1);
		 * System.out.println(result);
		 */
         ProxyUtil proxy=new ProxyUtil(new MathImpl());
         
         MathI math=(MathI)proxy.getProxy();
         int i=math.add(1,1);
         System.out.println(i);
         
         int j=math.div(1,1);
         System.out.println(j);
		 
	}
}

源码链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值