动态代理

import java.lang.reflect.*;
//接口功能
interface Person {

    void giveMoney();
}
//实现功能
class Student implements Person {
	private String name;
	public Student(String name) {
		this.name = name;
	}
	public void giveMoney() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println(name + "上交班费10元");
	}
}
//运行时间
class MonitorUtil {
//	线程独立运行
	private static ThreadLocal<Long> t1 = new ThreadLocal<>();
//	开始计时
	public static void start() {
		t1.set(System.currentTimeMillis());
	}
//	结束计时
	public static void finish(String methodName) {
		long finishTime = System.currentTimeMillis();
		System.out.println(methodName + "方法耗时" + (finishTime = t1.get()) + "ms");
	}
}
/*
 * 动态代理标识
 * 实现动态代理接口invoke方法
 * InvocationHandler.invoke()方法可实现target引用类的实现方法
 */
class StuInvocationHandler<T> implements InvocationHandler {
	T target;	//被代理对象
//	构造方法
	public StuInvocationHandler(T target) {
		this.target = target;
	}
/**
 * proxy:代表动态代理对象(实现接口的类型)proxy
 * method:代表正在执行的方法
 * args:代表调方法时需要传入的参数
 */
	public Object invoke(Object proxy,Method method,Object[] args) throws Throwable {
		System.out.println("代理执行" + method.getName() + "方法");	//代理执行giveMoney方法
		
//		计算耗时
		MonitorUtil.start();
		Object result = method.invoke(target,args);
		MonitorUtil.finish(method.getName());
		
		return result;
	}
}
/**
 * 动态代理
 * 1、实例化被代理类
 * 2、实例化一个动态接口类型的代理类,并把要代理的类作为参数传入动态代理类中
 * 3、由包方法Proxy获取实现接口方法的类的对象
 * @author Administrator
 *
 */
public class TestDemo {
    public static void main(String[] args) throws Exception {
//    	创建一个实例对象,该对象是被代理的类
    	Person zs = new Student("张三");
//    	创建一个与代理对象相关联的InvocationHandler
    	InvocationHandler stuHandler = new StuInvocationHandler<Person>(zs);
//    	方法Proxy.newProxyInstance(接口类的加载器(用于定义代理类),代理类需要实现的接口,实现动态代理接口的对象(调用处理器))返回实现接口的对象
//    	猜测:反射stuHandler信息获取该类invoke(Object,Method,Object[])方法,获取实现Class<?>[]接口方法的对象的方法method和数据args并由invoke方法调用
    	Person stuProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?> []{Person.class}, stuHandler);
//    	代理执行缴费
    	stuProxy.giveMoney();
    }
} 
//面向对象的动态代理需要扩展包cglib

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值