动态代理

xiaoxiao2021-02-28  26

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
转载请注明原文地址: https://www.6miu.com/read-2629798.html

最新回复(0)