博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态代理
阅读量:6732 次
发布时间:2019-06-25

本文共 2085 字,大约阅读时间需要 6 分钟。

hot3.png

静态代理仅仅能够代理某一个类,如果有多个类,就需要写多个代理类。

Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类:

    1)Interface InvocationHandler:该接口中仅定义了一个方法:

            public Object invoke(Object obj,Method method,Object[] args)

            在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。

            这个抽象方法在代理类中动态实现。

    2)Proxy:该类即为动态代理类

            static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):

            返回代理类的一个实例,返回后的代理类可以当做被代理类使用(可以使用被代理类的在接口中声明的方法)

     动态代理实现步骤:

        1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class TimeHandler implements InvocationHandler { private Object target;  public TimeHandler(Object target) {  super();  this.target = target; }   /*  * 参数:  * proxy 被代理对象  * method 被代理对象的方法  * args 方法的参数  *   * 返回值:  * Object 方法的返回值  *   */ @Override public Object invoke(Object proxy, Method method, Object[] args)   throws Throwable {  // TODO Auto-generated method stub  long starttime = System.currentTimeMillis();  System.out.println("汽车开始行驶.....");  method.invoke(target);  long endtime = System.currentTimeMillis();  System.out.println("汽车结束行驶.....时间为:" + (endtime - starttime) + "(毫秒)");  return null; }}

        2.创建被代理的类以及接口

import java.util.Random;public class Car implements Moveable { @Override public void move() {  // TODO Auto-generated method stub  try {   Thread.sleep(new Random().nextInt(1000));   System.out.println("汽车行驶中.....");  } catch (InterruptedException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } }}
package com.imooc.proxy;public interface Moveable { public void move();}

        3.调用Proxy的静态方法,创建一个代理类

            newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)

public class Test { /*  * JDK动态代理测试类  */ public static void main(String[] args) {  Car car = new Car();  InvocationHandler h = new TimeHandler(car);  Class
 cls = car.getClass();  /*   * loader:类加载器   * interface:实现接口   * h: InvocationHandler   */  Moveable m = (Moveable)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h);  m.move(); }}

4.通过代理调用方法

转载于:https://my.oschina.net/duanvincent/blog/387169

你可能感兴趣的文章
我的友情链接
查看>>
王爽《汇编语言》笔记要点
查看>>
WIN7系统C盘无法写入文件
查看>>
AIX 5L学习总结2
查看>>
linux shell 查看进程的可执行程序路径
查看>>
今天我终于搞明白的HSRP 的操作命令和原理
查看>>
资料集合
查看>>
cookie注入&中转注入笔记
查看>>
Linux常用命令大全-toolfk程序员在线工具网
查看>>
springmvc+mybatis+sql server实现简单登录功能【转】
查看>>
Linux禁Ping的方法
查看>>
ssh不断线的配置方法
查看>>
CentOS后台运行和关闭、查看后台任务命令
查看>>
Mysql学习总结(11)——MySql存储过程与函数
查看>>
ALTER EXTSEQNO must be performed on each corresponding downstream reader
查看>>
生产环境linux服务器系统安全配置
查看>>
我的友情链接
查看>>
java-学习2
查看>>
MySql中 delimiter 详解
查看>>
浏览器history操作实现一些功能
查看>>