jdk动态代理

jdk动态代理:基于反射动态生成代理对象

pwp动态代理的步骤比较复杂,无需特别深入的理解,在jdk中固定的步骤,只需要知道这些步骤即可,不必钻牛角尖

动态代理涉及到的三个反射包类

  1. InvocationHandler
  2. Method
  3. Proxy

1. InvocationHandler接口(调用处理器)

就一个invoke()方法,表示代理对象要执行的功能代码。你的代理类要完成的功能就写在invoke方法中
参数:
Object proxy:jdk创建的代理对象,无需赋值。
Method method:目标类中的方法,jdk提供的method对象。
Object[ ] args:目标类中方法的参数,jdk提供的。

2、Method类

表示方法的,确切的说 就是目标类中的方法。
作用:通过Method可以执行某个目标类中的方法,Method.invoke();

Method.invoke(目标对象,方法的参数);
Object res = method.invoke(target, “刘龙”);//这里不需要指定方法的名称,jdk会帮我们寻找

说明:Method.invoke();就是帮我们指定目标方法的,代替目标方法的执行,等同于静态代理中的使用目标类调用方法。

//创建接口
public interface sell {
    void sellcart(String name);
}

//创建接口实现类
public class railway implements sell {
    @Override
    public void sellcart(String name) {
        System.out.println(name+"在火车站出售了火车票--------");
    }
}

public class TestApp {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

   
     //使用反射机制执行sellcart方法,核心Method(类中的方法)
        sell target = new railway();
     //获取sellcart名称对应的Method类对象
        Method method = sell.class.getMethod("sellcart", String.class);
       //通过Method可以执行 sellcart方法调用
        /**
         * invoke是Method类中的一个方法。表示执行方法的调用
         * 参数:
         * 1、Object 表示对象的,要执行这个对象的方法
         * 2、Object...args、方法执行时的参数值
         返回值:
           Object:方法执行后的返回值
         */
        //表达的意思就是,执行target对象的sellcart方法,参数是刘龙
        Object res = method.invoke(target, "刘龙");//执行代理方法
    }
}

3、 Proxy类

动态代理的核心对象,创建代理对象。之前创建对象都是new类的构造方法(),现在我们是使用Proxy类的方法,代替new的使用。

方法:静态方法newProxyInstance()
作用是:创建代理对象,等同于静态代理中的TaoBao tao = new TaoBao();
参数:
1.ClassLoader loader类加载器:

负责向内存中加载对象的。使用反射获取对象的CladdLoader。例如类A a.getClass().getClassLoader(),目标对象的类加载器

2.Class[] interfaces:接口,
目标对象实现的接口,也是反射获取的

3.InvocationHandler h:我们自己写的,代理类要完成的功能。
返回值:就是代理对象

实现动态代理的步骤

1.创建接口,定义目标类要完成的功能
2.创建目标类实现接口
3.创建InvocationHandler 接口的实现类,在invoke方法中完成代理类的功能
(1)调用目标方法
(2)增强功能
4.使用Proxy类的静态方法,创建代理对象。并把返回值转为接口类型

你可能感兴趣的:(java,开发语言,jvm)