Dynamic Proxy (动态代理模式)
动态代理(运行期行为)主要有一个 Proxy类 和一个 InvocationHandler接口
动态代理角色:
1. 抽象主题角色
2. 真实主题角色(实现了抽象主题接口)
3. 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法)
Proxy 要调用 newProxyInstance方法
代码演示:
1.抽象主题角色 SubjectDemo.java
- package com.dynamicproxy ;
- public interface SubjectDemo
- {
- public void request() ;
- }
2. 真实主题角色 RealSubjectDemo.java
- package com.dynamicproxy ;
- public class RealSubjectDemo implements SubjectDemo
- {
- public void request()
- {
- System.out.println("实现了某请求") ;
- }
- }
3. 动态代理主题角色 DynamicProxySubjectDemo.java
- package com.dynamicproxy ;
- import java.lang.reflect.InvocationHandler ;
- import java.lang.reflect.Method ;
- public class DynamicProxySubjectDemo implements InvocationHandler
- {
- private Object sub ;
- public DynamicProxySubjectDemo(Object obj)
- {
- this.sub = obj ;
- }
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
- {
- System.out.println("before"+method) ;
- method.invoke(sub, args) ;//真实的调用方法操作
- System.out.println("after"+method) ;
- return null ;
- }
- }
4.客户端 Client.java
- package com.dynamicproxy ;
- import java.lang.reflect.InvocationHandler ;
- import java.lang.reflect.Proxy ;
- public class Client
- {
- public static void main(String[] args)
- {
- RealSubjectDemo rsd = new RealSubjectDemo() ;
- InvocationHandler handler = new DynamicProxySubjectDemo(rsd) ;
- Class<?> classType = handler.getClass() ;
- // classType.getClassLoader() 动态代理类的类加载器
- //rsd.getClass().getInterfaces() 代理类要实现的接口列表
- //handler 指派方法调用的调用处理程序
- SubjectDemo sd = (SubjectDemo)Proxy.newProxyInstance(classType.getClassLoader(), rsd.getClass().getInterfaces(), handler ) ;
- //这行代码一执行 转到 InvocationHandler handler = new DynamicProxySubjectDemo(rsd)
- //执行invoke方法
- sd.request() ;
- }
- }
Dynamic Proxy (动态代理模式)的更多相关文章
- Java设计模式—Proxy动态代理模式
代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...
- 【Java深入研究】5、Proxy动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- JAVA动态代理模式(从现实生活角度理解代码原理)
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...
- Java-马士兵动态代理模式
Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...
- Java静态代理与动态代理模式的实现
前言: 在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总找不到时间去找他,他也没办法.后来,房东想了一个办法,他找到 ...
- java jdk动态代理模式举例浅析
代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- iOS的动态代理模式的实现
动态代理模式的应用很多,特别是在不能修改被代理类的前提下,要对执行某些方法时需要打log或者捕捉异常等处理时,是一个非常方便的方法.只需要少量修改客户端(场景类)代码和添加一个代理类就可以实现,这个符 ...
- Proxy 动态代理 InvocationHandler CGLIB MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- BZOJ1975 SDOI2010魔法猪学院
就是个A*,具体原理可以参考VANE的博文. 正解要手写堆,会被卡常,也许哪天我筋搭错了写一回吧. #include<bits/stdc++.h> #define r register u ...
- [CSAcademy]Squared Ends
[CSAcademy]Squared Ends 题目大意: 给你一个长度为\(n(n\le10^4)\)的数列\(\{A_i\}(A_i\le10^6)\).定义区间\(A_{[l,r]}\)的代价为 ...
- Ubuntu 12.04下spark1.0.0 集群搭建(原创)
spark1.0.0新版本的于2014-05-30正式发布啦,新的spark版本带来了很多新的特性,提供了更好的API支持,spark1.0.0增加了Spark SQL组件,增强了标准库(ML.str ...
- LINQ中的动态排序
使用Linq动态属性排序 使用反射: public static Func<T,Tkey> DynamicLambda<T, Tkey>(string propertyName ...
- 如何屏蔽PHP浏览器头信息X-Powered-By
将 php.ini 中,将 “expose_php = On” 改为 “expose_php = Off”
- Div+CSS展示物流跟踪轨迹信息
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- JavaScript中的call和apply应用
ECMAScript3给Function的原型定义了两个方法,他们是Function.prototype.call 和 Function.prototype.apply. 在实际开发中,特别是在一些函 ...
- iOS8 NotificationCenter Extension 简介
在最新的WWDC14上面,苹果发布了iOS8的一些新特性,而其中最让程序员兴奋的特性莫过于Extension,或者称之为Widget. 下面就来尝鲜试验一把. 一.Extension简介 首先,苹果只 ...
- 【mybatis】mybatis访问报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 或者 feign被调用方使用的mybatis总报空指针异常java.lang.NullPointerException,而变量都没有问题的情况
mybatis访问报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 需要检查的步骤: ...
- GitHub上如何删除repository仓库
1.选择你要删除的仓库名称点击进入. 2.看右边竖向导航栏,选择最下面的settings选项. 3.拉到最下面,看有一个delete this repository的按钮. 4.点击按钮后,会有一个弹 ...