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

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

难度中级
时长 2小时 0分
学习人数
综合评分9.70
184人评价 查看评价
9.8 内容实用
9.6 简洁易懂
9.7 逻辑清晰
  • 天书啊
    查看全部
  • @设计模式——代理模式——静态代理的概念 一、静态代理 1、静态代理:代理和被代理对象在【代理之前】都是【确定】的。他们都实现【相同的接口或者继承相同的抽象类】 2、代理实现方法: (1)继承法:代理类直接【继承】被代理类,实现其原有方法,并添加一些额外功能 (2)聚合方法:代理类实现【相同的功能接口:很重要,事项相同接口,不同代理也可以进行相互代理】,并在内声明一个被代理类的对象(类似封装),通过内部对象实现其原有方法,并添加额外功能
    查看全部
  • 有些不理解
    查看全部
  • @设计模式——代理模式——了解JDK动态代理 一、JDK动态代理 1、目的:动态产生代理,实现对【不同类】,【不同方法】的代理 2、java动态代理类,位于java.lang.reflect包下,一般涉及两个类: (1)Interface InvocationHandler:该接口中仅定义了一个方法public object invoke(obj,method,args):实际使用中,obj指被代理类的对象,method指被代理的方法,args为该方法参数数组。这个抽象方法在代理类中动态实现 (2)Proxy:该类即为动态代理类:static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理类的一个实例,返回后的代理类可以被当作代理类使用(可使用被代理类的在【接口中】声明过的方法)。 · 第一个参数loader为被代理类的加载器,通过被代理类.getClass().getClassLoader()得到 · 第二个参数interfaces为被代理类实现的所有接口,同样通过getClass().getInterface()得到 · 第三个参数handler就是自己实现的InvocationHandler的实现类的对象 3、***实现: · 声明一个代理h实现InvocationHandler接口,通过【构造方法接受被代理类】,并实现invoke方法,添加业务逻辑(实现原有功能并添加额外功能) · 在测试类中,通过共同实现接口的实例获得代理对象,并实现方法,如Interface1 i = (Interface1)Proxy.newProxyInstance(classLoader,classInterfaces,h); · 通过动态代理对象m,代用其方法i.fun();
    查看全部
  • JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口 。如果想代理没有实现接口的类可以使用CGLIB包。 CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO(Persistent Object 持久化对象)字节码的动态生成。 注意:CGLIB不能对“final”修饰的类进行代理。 相关代码——(下): @CglibProxy.java public class CglibProxy implements MethodInterceptor { private Enhancer enhancer=new Enhancer(); public Object getProxy(Class cls){ //设置创建子类的类 enhancer.setSuperclass(cls); enhancer.setCallback(this); return enhancer.create(); } /** * 参数:object:拦截所有目标类方法的调用,method:目标方法的反射对象,args:方法的参数,methodproxy:代理类的实例。 */ public Object intercept(Object object, Method method, Object[] args, MethodProxy methodproxy) throws Throwable { syso("日志开始..."); methodproxy.invokeSuper(object, args); syso("日志结束..."); return null; } } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 代理模式的概念: 为其他对象提供一种代理,以控制对这个对象的访问; 为其他对象提供一种代理以控制对这个对象的访问。代理对象起到中介作用,可去掉功能服务或增加额外的服务。
    查看全部
  • 代理模式的分类: 远程代理模式:为不同地理的对象提供局域网代表对象(例子:通过远程代理可以监控各个店铺,使之可以直观的了解店里的情况) 虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建 保护代理:控制用户的访问权限 智能引用代理:提供对目标对象提供额外的服务(火车票代售处)
    查看全部
  • 作业:时间、日志的叠加 public static void main(String[] args) throws Throwable { Car car = new Car(); InvocationHandler timehandler =new TimeHandler(car); Class<?> cls = car.getClass(); /** * loader 类加载器 * interfaces 实现接口 * h InvocationHandler */ Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), timehandler); InvocationHandler logHandler= new LogHandler(m); Class<?> clsm =m.getClass(); Moveable m2 = (Moveable) Proxy.newProxyInstance(clsm.getClassLoader(), clsm.getInterfaces(), logHandler); m2.move(); }
    查看全部
  • /* * 仔细理解一下, 就是一层层嵌套叠加。。。 * 先调用ctp.move(); 输出 “汽车开始行驶...” * clp参数传到ctp.move()中的m.move方法;调用clp.move(),输出 “日志开始...” * car参数传到clp.move()中m.move方法;调用Car对象中的move方法。输出 “汽车行驶中....” * 然后调完clp.move()返回,输出 “日志结束...” * 调完返回ctp.move()返回,输出“汽车结束行驶... 汽车行驶时间: 毫秒” * */
    查看全部
  • 代理的常见模式: 1.远程代理(为不同地理位置的的对象提供局域网代表对象) 2.虚拟代理(根据需要将资源消耗大的复杂对象进行延迟,真正需要时再创建) 3.保护代理(控制对一个对象的访问权限) 4.智能(引用)代理(对代理对象提供一些额外的服务) 注:车票代售是智能(引用)代理的方式。
    查看全部
  • 这些知识真是闻所未闻。。通过拿到编译器来编译源代码并且load到内存中。。。 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null); Iterable units = filrMgr.getJavaFileObjects(fileName); CompilationTask task = compiler.getTask(null, fileMgr, null,null.null,units); task.call(); fileMgr.close(); ClassLoader loader = ClassLoader.getSystemClassLoader(); Class c = loader.loadClass("xxx");
    查看全部
  • 上一讲到代理,内部的业务逻辑是硬编码的,如何实现真正的动态代理,动态的指定业务逻辑呢? 1.需要创建一个事务处理器,首先创建一个接口也就是InvocationHandler,为了模拟JDK,这里把接口的名字和JDK事务处理器名称一样,同样写一个方法叫做invoke(),用来表示对某个对象的某个方法进行业务处理,所以需要把某个对象以及对象的方法作为invoke()方法的参数传递进来,invoke(Object obj,Method method),方法作为参数使用到了java反射,需要把此包引入。这样InvocationHandler接口就完成了。 2.创建事务处理实现类比如说时间代理TimerProxy,实现了InvocationHandler接口,这样结构就成了 public class TimerProxy implements InvocationHandler{ @Override public void invoke(Object o, Method m) { //业务逻辑 method.invoke(目标对象,参数); //业务逻辑 } 需要将目标对象传入,没有参数可以不写参数,创建代理对象的构造方法,初始化目标对象 3.在Proxy类的newProxyInstance()方法中,除了要把目标Class接口作为参数外,还需要把事务处理器InvocationHandler 传进去,然后更改创建实例对象中硬编码的部分用事务处理器方法替代即可。难点在于字符串的拼接。
    查看全部
  • 1,静态代理:代理和被代理对象在代理之前是确定的。他们都实现相同的接口或则继承相同的抽象类。 -->我们可以通过System.currentTimeMillis()方法来返回长整数类型的时间(以毫秒为单位),我们还可以通过Random的对象ra来通过ra.nextInt(1000)来获取0-1000的随机整数。 (1)通过继承来实现代理:首先创建接口,然后代理类为子类,被代理类为父类父类实现接口,子类覆写的方法中通过 super.同名函数 调用父类中同名函数,然后在添加上子类的业务逻辑代码。 (2)通过聚合来实现代理:聚合就是在一个类中使用另一个类对象。我们把被代理类作为代理类的属性,然后通过构造方法把被代理类的对象传进去,然后初始化属性对象,然后在覆写方法中调用属性对象的同名方法,然后添加代理对象的业务逻辑。
    查看全部
  • 完善动态代理实现 首先得到系统编译器,通过编译器得到文件管理者,以获取文件,然后编译器执行编译任务,完成编译之后,将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); return ctr.newInstance(new Car());
    查看全部
  • @设计模式——代理模式——静态代理的实现 1、聚合代理优于继承代理。因为实现功能叠加的情况下,聚合代理通过相互代理可以实现功能重用,而继承代理必须写多个类来实现多功能叠加。 2、但静态代理只能代理一种类型的被代理类,换个类型的就不行了,这需要动态代理
    查看全部
首页上一页1234567下一页尾页

举报

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

微信扫码,参与3人拼团

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

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