如何管控好数据保护好隐私?
|
UserHandler 是用户代理类,构造函数中的 UserDao 是真实对象,通过把 UserDao 隐藏进 UserHandler ,通过 UserHandler 中的 UserDao 执行真正的方法。 类加载器、接口数组你可以把它理解为一个方法树,每棵叶子结点都是一个方法,通过后面的 proxy.saveUser() 来告诉 JVM 执行的是方法树上的哪个方法。 用户代理是通过类加载器、接口数组、代理类来得到的。saveUser 方法就相当于是告诉 proxy 你最终要执行的是哪个方法,这个 proxy.saveUser 方法并不是最终直接执行的 saveUser 方法,最终的 saveUser 方法是由 UserHandler 中的 invoke 方法触发的。 上面这种在编译期无法确定最终的执行方法,而只能通过运行时动态获取方法的代理模式被称为 动态代理。 动态代理的优势是实现无侵入式的代码扩展,也可以对方法进行增强。此外,也可以大大减少代码量,避免代理类泛滥成灾的情况。 所以我们现在总结一下静态代理和动态代理各自的特点。 静态代理
动态代理
在上面的代码示例中,我们是定义了一个 UserDao 接口,然后有 UserDaoImpl 接口的实现类,我们通过 Proxy.newProxyInstance 方法得到的也是 UserDao 的实现类对象,那么其实这是一种基于接口的动态代理。也叫做 JDK 动态代理。 是不是只有这一种动态代理技术呢?既然都这么问了,那当然不是。 除此之外,还有一些其他代理技术,不过是需要加载额外的 jar 包的,那么我们汇总一下所有的代理技术和它的特征
下面我们就来依次介绍一下这些动态代理工具的使用 CGLIB 动态代理
上面我们提到 JDK 动态代理是基于接口的代理,而 CGLIB 动态代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 ,也就是说 CGLIB 动态代理采用类继承 -> 方法重写的方式进行的,下面我们先来看一下 CGLIB 动态代理的结构。 (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
