jdk动态代理:基于反射动态生成代理对象
pwp动态代理的步骤比较复杂,无需特别深入的理解,在jdk中固定的步骤,只需要知道这些步骤即可,不必钻牛角尖
动态代理涉及到的三个反射包类
- InvocationHandler
- Method
- 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类的静态方法,创建代理对象。并把返回值转为接口类型