为了账号安全,请及时绑定邮箱和手机立即绑定

模式的秘密---代理模式

难度中级
时长 2小时 0分
学习人数
综合评分9.70
184人评价 查看评价
9.8 内容实用
9.6 简洁易懂
9.7 逻辑清晰
  • 代理模式
    查看全部
  • 使用继承和聚合实现静态代理。
    查看全部
  • 使用继承和聚合两种方式实现代理,这两者哪个好呢?
    查看全部
  • 什么是聚合? 就是一个类中调用另一个类的对象。例如将一个类的对象传进到另一个类的构造方法的参数中。
    查看全部
  • 智能引用代理的两种实现方式:<br> 静态代理和动态代理 一,静态代理的概念:代理和被代理对象在代理之前是确定的,它们都实现相同的接口或者继承相同的抽象类,
    查看全部
  • 一,代理模式的定义 1)为其他对象提供一种代理,以控制对这个对象的访问。 2)代理对象起到了一个中介的作用。可以去掉功能服务或者增加额外的服务。 二,常见的代理模式 1)远程代理。类似于客户端,服务器这种模式,是远程通信的一个缩影,为不同地理的对象提供局域网代表对象, 2)虚拟代理。根据需要将一个资源消耗很大或者比较复杂的对象进行延迟,真正需要时才进行创建,例子 :浏览帖子的时候,会有文字和图片, 加入这个图片非常大的话,我们一直在这加载,文字也不能浏览,这样会非常影响我们的体验效果,所以可以采用虚拟代理,用一张虚拟的图片来代替真实的图片,来进行显示,当真实的图片加载完成之后呢,再进行显示,这是虚拟代理的一个简单应用。 3)保护代理。就是控制对一个对象的访问权限,比如发帖的功能,普通用户如果没有注册,只要浏览帖子的功能,只要当注册通过之后,才能进行发帖,删除,评论等一些操作,那么这个权限的控制呢,可以通过保护代理可以实现。 4)智能引用代理就是提供对目标对象的一些额外的服务,
    查看全部
  • 1、代理概念、分类及应用场景 为其他对象设置总代理,以控制对这个对象的访问; 代理对象起到了中介的作用,去掉了某些功能,或增加了些额外的服务。 四类: Remote Proxy,客户端服务器的模式 Virtual Proxy,资源消耗很大,或复杂的对象,需要延迟,需要时创建, Protect Proxy, 保护和控制权限 Smart Reference Proxy,提供额外服务。 为什么只讲智能引用代理? 使用得多:日志处理、权限管理、事务处理... 静态代理(继承、聚合) JDK动态代理实现日志处理的功能 模拟JDK动态代理实现:在代理类Proxy和被代理类RealSubject之间,加入了invocationHandler。 调用jar包中某个类的方法,不能改源码,AOP面向切面,增加额外事务逻辑。
    查看全部
    0 采集 收起 来源:课程总结

    2016-06-23

  • 上一讲到代理,内部的业务逻辑是硬编码的,如何实现真正的动态代理,动态的指定业务逻辑呢? ①需要创建一个事务处理器,首先创建一个接口也就是InvocationHandler,为了模拟JDK,这里把接口的名字和JDK事务处理器名称一样,同样写一个方法叫做invoke(),用来表示对某个对象的某个方法进行业务处理,所以需要把某个对象以及对象的方法作为invoke()方法的参数传递进来,invoke(Object obj,Method method),方法作为参数使用到了java反射,需要把此包引入。这样InvocationHandler接口就完成了。 ②创建事务处理实现类比如说时间代理TimerProxy,实现了InvocationHandler接口,这样结构就成了 ——————TimerProxy implements InvocationHandler{ ————————-@override ————————-void invoke(Object obj,Method method){ ———————————//业务逻辑<br> —————————————method.invoke(目标对象,参数); ————————————//业务逻辑<br> ——————————} —————————} 需要将目标对象传入,没有参数可以不写参数,创建代理对象的构造方法,初始化目标对象 ③在Proxy类的newProxyInstance()方法中,除了要把目标Class接口作为参数外,还需要把事务处理器InvocationHandler 传进去,然后更改创建实例对象中硬编码的部分用事务处理器方法替代即可。难点在于字符串的拼接。 总结。
    查看全部
  • 模拟jdk动态代理,实现功能,通过Proxy 的newProxyInstance返回动态代理对象 1.声明一段源码(动态代理生成,主要是以拼接一段源码为主,就是字符串的拼接) 2.编译这段源码,产生一个新的类,使用JDK编译API 3.将这个类加载到内存当中,产生一个新的对象(代理对象) 4.return代理对象
    查看全部
  • public class CGlibProxy implements MethodInterceptor {<br> <br> private Enhancer enhancer = new Enhancer();<br> <br> public Object getProxy(Class clazz){<br> //设置创建子类的类<br> enhancer.setSuperclass(clazz);<br> //设置回调<br> enhancer.setCallback(this);<br> //创建子类的实例<br> return enhancer.create();<br> }<br> <br> /**<br> * 拦截所有目标类方法的调用<br> * obj目标类的实例<br> * m目标方法的返回对象<br> * args方法的参数<br> * proxy代理类的实例<br> */<br> @Override<br> public Object intercept(Object obj, Method m, Object[] args, <br> MethodProxy proxy) throws Throwable {<br> <br> proxy.invokeSuper(obj, args);<br> <br> return null;<br> }<br> <br> }
    查看全部
  • jdk动态代理与cglib动态代理区别
    查看全部
  • 实现不同类,不同方法的代理 所谓动态代理是这样一种class 他是在运行时生成的class 该class需要实现一组interface 使用动态代理类时,必须实现InvocationHandler接口 1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法 2.创建被代理的类以及接口 3.调用Proxy的静态方法,创建一个代理类 ---newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h) 4.通过代理调用方法
    查看全部
  • 上一讲到代理,内部的业务逻辑是硬编码的,如何实现真正的动态代理,动态的指定业务逻辑呢? ①需要创建一个事务处理器,首先创建一个接口也就是InvocationHandler,为了模拟JDK,这里把接口的名字和JDK事务处理器名称一样,同样写一个方法叫做invoke(),用来表示对某个对象的某个方法进行业务处理,所以需要把某个对象以及对象的方法作为invoke()方法的参数传递进来,invoke(Object obj,Method method),方法作为参数使用到了java反射,需要把此包引入。这样InvocationHandler接口就完成了。 ②创建事务处理实现类比如说时间代理TimerProxy,实现了InvocationHandler接口,这样结构就成了 ——————TimerProxy implements InvocationHandler{ ————————-@override ————————-void invoke(Object obj,Method method){ ———————————//业务逻辑<br> —————————————method.invoke(目标对象,参数); ————————————//业务逻辑<br> ——————————} —————————} 需要将目标对象传入,没有参数可以不写参数,创建代理对象的构造方法,初始化目标对象 ③在Proxy类的newProxyInstance()方法中,除了要把目标Class接口作为参数外,还需要把事务处理器InvocationHandler 传进去,然后更改创建实例对象中硬编码的部分用事务处理器方法替代即可。难点在于字符串的拼接。 总结。
    查看全部
  • 在代理类与被代理类之间加入了InvocationHandler,实现事务的处理。
    查看全部
    0 采集 收起 来源:课程总结

    2016-06-22

  • 完善动态代理实现:首先得到系统编译器,通过编译器得到文件管理者,然后获取文件,然后编译器执行编译任务,完成编译之后,将class文件加载到类加载器中,通过构造方法得到实例,然后调用newInstance()接收一个对象的实例。 (1)拿到编译器 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); (2)文件管理者 StandardJavaFileManager fileMgr = Compiler.getStandardFileManager(null,null,null); (3)获取文件 Iterable units = fileMgr.getJavaFileObjects(filename); (4)编译任务 CompilationTask t =compiler.getTask(null,fileMgr,null,null,null,units); (5)load到内存 ClassLoader cl = ClassLoader.getSystemClassLoader(); Class c = cl.loadClass(”com.imooc.proxy.$Proxy0”); (6)通过代理对象的构造器构造实例 Constructor ctr = c.getConstructor(infce); ctr.newInstance(new Car());
    查看全部

举报

0/150
提交
取消
课程须知
本课程是 Java 开发课程的高级课程,希望各位小伙伴们在学习本课程之前,了解以下内容: 1)初步具备面向对象的设计思维 2)了解多态概念 3)了解反射
老师告诉你能学到什么?
1、代理模式概念机分类 2、代理模式应用场景 3、掌握静态代理、动态代理运用 4、理解JDK动态代理实现原理

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!