-
相关代码——(上): @Car.java public class Car implements Moveable{ public void move() { //实现打车 try { Thread.sleep(new Random().nextInt(1000)); syso("车行驶中..."); } catch (Exception e) { ... } } } @Moveable.java public interface Moveable { void move(); } @CarLogProxy.java public class CarLogProxy implements Moveable { private Moveable m; public CarLogProxy(Moveable m){ super(); this.m=m; } public void move() { syso("日志开始..."); m.move(); syso("日志结束..."); } } @CarTimeProxy.java public class CarTimeProxy implements Moveable { private Moveable m; public CarTimeProxy(Moveable m){ super(); this.m=m; } public void move() { long starttime=System.currentTimeMillis(); syso("车开始行驶..."); m.move(); long endtime=System.currentTimeMillis(); syso("车结束行驶。"); syso("车行驶时间:"+(endtime-starttime)+"毫秒!"); } } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
代理模式查看全部
-
yyy查看全部
-
代理模式 1、概念:为其他对象提供一种代理,以控制对这个对象的访问(例如火车站代售处)。代理对象起到中介作用,可去掉功能服务或增加额外的服务。 2、分类:a、远程代理---为不同地理的对象提供局域网代表对象。(类似于客户端和服务器端) b、虚拟代理---根据需要将资源消耗很大的对象进行延迟,真正需要的时候才进行创建。(网页中 图片的加载,先用一张虚拟的图片进行显示,等图片加载完成后再进行显示) c 、保护代理---控制用户的访问权限。(发帖功能) d、智能应用代理---提供对目标对象一些额外的服务。(火车站) 代理模式的分类: 远程代理模式:为不同地理的对象提供局域网代表对象(例子:通过远程代理可以监控各个店铺,使之可以直观的了解店里的情况) 虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建 保护代理:控制用户的访问权限 智能引用代理:提供对目标对象提供额外的服务(火车票代售处)查看全部
-
继承和聚合 聚合方式执行效率更高~查看全部
-
代理模式定义 :为其他对象提供一种代理,以控制对这个对象的访问 分类:a、远程代理---为不同地理的对象提供局域网代表对象。(类似于客户端和服务器端) b、虚拟代理---根据需要将资源消耗很大的对象进行延迟,真正需要的时候才进行创建。(网页中 图片的加载,先用一张虚拟的图片进行显示,等图片加载完成后再进行显示) c 、保护代理---控制用户的访问权限。(发帖功能) d、智能应用代理---提供对目标对象一些额外的服务。(火车站)查看全部
-
以智能引用代理为例:
代理的两种实现方式
案例描述:提供一个接口,该接口中提供一个车的move方法。正常情况下没有使用代理时,创建一个Car实现该接口,并实现该接口的方法,然后就可以通过创建该实现类的对象并赋值给接口来调用该方法了。
【1】静态代理:代理和被代理对象在代理之前是确定的,他们都实现相同的接口或者继承相同的抽象类。
【a】继承的方式实现静态代理:正常情况下是通过Car的方法来完成操作,代理的意思是,创建一个类Car1并继承类Car,并在继承类Car1的构造方法中通过super调用父类的方法,也可以在方法中添加一些额外的功能,这个类Car1就是类Car的代理,最后就可以通过创建Car1的对象赋值给接口,再调用move方法。
【b】聚合的方式实现静态代理:聚合就是在该类中声明被代理的对象,创建一个Car2,并实现该接口,然后在类中声明Car,通过构造方法对Car的对象进行赋值,然后在实现的方法中通过Car对象调用move()方法。
【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();
查看全部 -
实战报错:
原因如下:导入包不全
报错分析:
NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误
查看全部 -
作业:
package com.design.proxy.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.design.proxy.Car;
import com.design.proxy.Moveable;
public class Test {
/**
* JDK动态代理测试类
*/
public static void main(String[] args) {
Car car = new Car();
InvocationHandler h = new TimeHandler(car);
Class<?> cls = car.getClass();
/**
* loader 类加载器
* interfaces 实现接口
* h InvocationHandler
*/
Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h);
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()返回,输出“汽车结束行驶... 汽车行驶时间: 毫秒” * */查看全部
-
确实讲得可以,可以看得出来老师有认真备课查看全部
-
看到这里确实真心有感慨 , 虽然前面几节的评论不是特别好 , 但是我没有理会别人的看法(那些轻易对别人下定论的人才真是可笑) , 一路坚持看了下来. 老师比较完整的重现了 jdk 动态代理的实现过程 , 包括用IO将我们的代码生成 java 文件 , 然后调用编译器api 将其编译成 class 文件, 然后加载编译后的类进入内存 , 调用代理方法。 甚至为了抽取出业务逻辑 , 降低耦合 , 提高通用性 , 自定义接口 , 将 InvocationHandler 接口和invoke方法的由来 也解释的很清楚 , 这节课让我看到了很多以前从未接触过的 api 和一种不同思维角度的原理实现。查看全部
-
静态代理:继承、聚合 动态代理:JDK、cglib JDK动态代理:只能对实现了接口的类实现代理 ,没有接口就不能实现JDK动态代理 CGLIB动态代理:针对类产生子类,通过方法拦截技术拦截所有的父类方法的调用查看全部
-
代理模式:包括哪些 代理模式 1、概念:为其他对象提供一种代理,以控制对这个对象的访问(例如火车站代售处)。代理对象起到中介作用,可去掉功能服务或增加额外的服务。 2、分类:a、远程代理---为不同地理的对象提供局域网代表对象。(类似于客户端和服务器端) b、虚拟代理---根据需要将资源消耗很大的对象进行延迟,真正需要的时候才进行创建。(网页中 图片的加载,先用一张虚拟的图片进行显示,等图片加载完成后再进行显示) c 、保护代理---控制用户的访问权限。(发帖功能) d、智能应用代理---提供对目标对象一些额外的服务。(火车站)查看全部
举报