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
动态代理
最新推荐文章于 2023-02-25 23:14:19 发布