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

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

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

JDK动态代理:

  为何叫JDK动态代理呢?

    所谓JDK,jdk是java开发工具包,它里面包含了一个动态代理的api

    代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

    何为动态?相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。

  下面我拿例子带入,具体的动态代理案例如下:

    首先按平时的方式来写,一个接口,一个实现它的类

      ISomeService接口

package cn.dawn.day09jdkdtproxy;/** * Created by Dawn on 2018/3/8. */public interface ISomeService {    public void doSome();}

 

      SomeServiceImpl类,实现ISomeService接口

 

package cn.dawn.day09jdkdtproxy;/** * Created by Dawn on 2018/3/8. */public class SomeServiceImpl implements ISomeService {    public void doSome() {        System.out.println("do something");    }}

 

      测试类,用动态代理的形式,对方法进行增强操作

 

package cn.dawn.day09jdkdtproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * Created by Dawn on 2018/3/8. */public class Test {    public static void main(String[] args) {        /*匿名内部类要想得到外面的值,需要把外面的值改为常量*/        final ISomeService service=new SomeServiceImpl();        /*用动态代理的方式生成ISomeService的对象,就是增强后的对象,可以看看newProxyInstance的方法参数,就有方法去写了*/        /*InvocationHandler是由代理实例的调用处理程序实现的接口。*/        ISomeService proxy=(ISomeService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {            /**             *invoke:每个代理实例都有一个关联的调用处理程序。当在代理实例上调用方法时,方法调用将被编码并分派给invoke 其调用处理程序的方法。             * @param proxy     代理对象,没啥用             * @param method        反射获取的方法             * @param args          方法的参数             * @return             * @throws Throwable             */            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                System.out.println("before===================");                method.invoke(service,args);//相当于执行目标类型的方法                return null;            }        });        proxy.doSome();    }}

 

      值得一提的是:Proxy是java.lang.reflect包下,正因如此,才叫JDK动态代理

转载地址:http://jfvdl.baihongyu.com/

你可能感兴趣的文章
Zabbix-3.0.3实现微信(WeChat)告警
查看>>
ArcGIS for Desktop入门教程_第三章_Desktop软件安装 - ArcGIS知乎-新一代ArcGIS问答社区...
查看>>
解决客户端访问https报错
查看>>
PHPCMS列表循环序列号自增标签代码
查看>>
2016年第15本:微信营销与运营----策略、方法、技巧与实践
查看>>
HTML之Data URL(转)
查看>>
注解式控制器
查看>>
ASP.Net中实现上传过程中将文本文件转换成PDF的方法
查看>>
maven The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path错误
查看>>
【数据库】数据库的并发问题与锁机制
查看>>
机器学习预测机动车摇号:神秘的第七位
查看>>
[转]数据恢复 文件恢复工具 DiskGenius v4.9.1 绿色专业版及单文件
查看>>
【转】http_load压力测试过程和使用方式
查看>>
NGUI使用教程 安装NGUI插件
查看>>
struts2的核心和工作原理
查看>>
Ignatius and the Princess III(杭电1028)(母函数)
查看>>
notify notifyAll 死锁
查看>>
beforeRouteLeave 实现vue路由拦截浏览器的需求,进行一系列操作 草稿保存等等
查看>>
SpringMVC工作原理 : HandlerMapping和HandlerAdapter
查看>>
【转】一种新型的Web缓存欺骗攻击技术
查看>>