java之动态代理 Dynamic Proxy

 时间:2024-10-27 15:37:08

1、动态代理中最核心的点,就是如何根据被代理的对象a,去创建代理对象:Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)这个方法就是jdk java.lang.reflect包中代理类Proxy,创建代理对象的方法。这个方法有三个参数:loader:类加载器,被代理对象的类加载器。通过反射获取 a.getClass().getClassLoader()interfaces:接口集合,被代理对象的接口集合,注意不是方法的集合。通过反射获取 a.getClass().getInterfaces()h:调用处理方法句柄。这个是一个重点,需要自己定义一个处理类H,并且实现InvocationHandler接口,此接口中有一个invoke方法。h就是这个类的实例,当我获取到代理对象后,通过代理对象调用方法时,会直接调用h的invoke方法,然后通过h的invoke方法转发到被代理对象a的相应方法。

java之动态代理 Dynamic Proxy
java之动态代理 Dynamic Proxy

2、编写测试类,首先模拟不是用代理的场景(1)创建一个House类和其接口IHouse,House类有一个名称属性,通过构造方法赋值,然后有一个buy方法,实现买房的功能。

java之动态代理 Dynamic Proxy
java之动态代理 Dynamic Proxy

3、(2)创建一个People类模拟一个人,小明,此类中有一个方法buyHouseByMyself,不通过代理买房子。

java之动态代理 Dynamic Proxy

4、(3)创建测试类TestDynamicProxy,编写测试方法,定义一个People对象小明和一个房子对象house,然后小明去调用buyHouseByMyself方法实现买房(4)输出如下

java之动态代理 Dynamic Proxy
java之动态代理 Dynamic Proxy

5、编写测试类,使用动态代理(1)编写 Invocation Handler 类MyInvocationHandler,实现InvocationHandler接口,及其invoke方法。此类中有一个构造方法,其参数 target 就是 被代理对象。 Object object=method.invoke(target, args);其作用就是去调用 target对象的相应的method方法,并将方法的返回值赋给object。 因为MyInvocationHandler类的构造方法参数是Object,所以对于任何对象都可以使用此Invocation Handler 类。

java之动态代理 Dynamic Proxy
java之动态代理 Dynamic Proxy

6、(2)创建好了MyInvocationHandler类,就可以去获取代理对象了。编写ProxyClass类,创建一个方法getDynamicProxy获取代理对象,其参数也是一个Object,表示这个类可以获取任何对象的代理对象。在创建代理对象时,创建一个MyInvocationHandler类的实例handle,作为newProxyInstance的参数,这样通过proxy代理对象调用方法就会自动走handle的invoke方法。另外两个参数是被代理对象object的类加载器和其所实现的接口的集合。

java之动态代理 Dynamic Proxy

7、(3)创建好了代理类,接着就可以测试了,我们测试通过代理去买房子。 所以在People类中添加一个方法buyHouseByDynamicProxy,其参数是House类的实例house; 然后在此方法中通过ProxyClass类获取house实例的代理对象houseProxy,接着调用buy方法。

java之动态代理 Dynamic Proxy

8、(4)在TestDynamicProxy类中编写测试方法,testBuyHouseByProxy,创建一个People实例小红,调用buyHouseByDynamicProxy方法,调用动态代理购买方法。(5)查看输出,通过代理的方式,也调用到了,House中的buy方法。

java之动态代理 Dynamic Proxy
java之动态代理 Dynamic Proxy

9、思考:通过本例子可以发现,只要给定任意一个对象object,就可以调用ProxyClass的getDynamicProxy方法直接获取一个代理对象,很是方便,没必要知道此对象所属的类。 这是和静态代理相对比的,对于静态代理,需要给每个被代理类提供一个特殊的代理类,也就是一个被代理类要创建一个代理类,如果被代理类很多,这将会创建更多的类。 比如:HouseProxy;FishProxy;CarProxy类,等等,使用动态代理一个ProxyClass类,就可以解决问题了,不仅减少了类的创建,代码量也大大减少。 在本例中:小明想要买房子,小明通过代理类,找到了一个代理,代理负责去帮助小明买房子。 代理在帮助小明买房子时可以去做一些特殊的操作,就是MyInvocationHandler类invoke方法中,method.invoke方法执行前后的事情。 可想而知,通过动态代理,可以实现spring的aop:比如给某一个特定的方法开启事物或者在某一个方法调用前后打印日志。

  • 北风之狼怎么打
  • 原神满足沙拉怎么做
  • 原神派蒙答题位置介绍
  • 原神古时孤影风龙废墟第二阶段采样点位置
  • 原神什么地方鱼最多
  • 热门搜索
    英语中秋节手抄报 小学生体育手抄报 小学生守则手抄报 关于宇宙的手抄报 消防安全手抄报资料 爱护校园环境手抄报 生活中的小数手抄报 保护环境手抄报大全 小学生中国梦手抄报 美丽的家乡手抄报