山西手动网站建设推广,手机网站建设公司哪家好,免费广告设计素材,百度指数怎么提升我们可以分成三步来完成jdk动态代理的实现 第一步#xff1a;创建目标对象 第二步#xff1a;创建代理对象 第三步#xff1a;调用代理对象的代理方法
public class Client {public static void main(String[] args) {//创建目标对象final OrderService target new OrderS…我们可以分成三步来完成jdk动态代理的实现 第一步创建目标对象 第二步创建代理对象 第三步调用代理对象的代理方法
public class Client {public static void main(String[] args) {//创建目标对象final OrderService target new OrderServiceImpl();//创建代理对象OrderService proxyObj (OrderService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new TImerInvocationHandler(target)); /*{//参数1Object proxy, 代理对象的引用// 参数2Method method, 目标对象上的目标方法// 参数3Object[] args 目标方法上的实参*//* Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//这个接口的目的就是为了让你有地方写增强代码//并且当调用代理对象的代理方法的时候此方法才会被jdk调用。System.out.println(增强1);// method.invoke(target,args );target.generate();System.out.println(增强2);return null;}}*//*);*///调用代理对象的代理方法proxyObj.generate();proxyObj.detail();proxyObj.modify();}}创建代理对象时我们传入的第三个参数就是实现InvocationHandler接口的实现类重写invoke方法就是让我们写增强功能的地方代码如下
public class TImerInvocationHandler implements InvocationHandler {private final OrderService target;public TImerInvocationHandler(OrderService target) {this.target target;}//参数1Object proxy, 代理对象的引用// 参数2Method method, 目标对象上的目标方法// 参数3Object[] args 目标方法上的实参Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//这个接口的目的就是为了让你有地方写增强代码//并且当调用代理对象的代理方法的时候此方法才会被jdk调用。long begin System.currentTimeMillis();Object retvalue method.invoke(target, args);long end System.currentTimeMillis();System.out.println(耗时(end-begin)毫秒);//返回值。这样才能保证目标方法中有返回值的方法在代理对象调用方法时可以拿到返回的值return retvalue;}
}在上述操作之前先创建相关类和接口下方为简单示例
//公共接口
public interface OrderService {void generate();void modify();void detail();
}
//实现类
public class OrderServiceImpl implements OrderService {Overridepublic void generate() {try {Thread.sleep(456);}catch (InterruptedException e){e.printStackTrace();}System.out.println(订单已生成);}Overridepublic void modify() {try {Thread.sleep(666);}catch (InterruptedException e){e.printStackTrace();}System.out.println(订单已修改);}Overridepublic void detail() {try {Thread.sleep(1000);}catch (InterruptedException e){e.printStackTrace();}System.out.println(订单详情);}
}