-
Car car = new Car(); Class<?> cls = car.getClass(); InvocationHandler timeHandler = new TimeHandler(car); Moveable timeMoveable = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), timeHandler); InvocationHandler logHandler = new LogHandler(timeMoveable); Moveable logMoveable = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), logHandler); logMoveable.move();
查看全部 -
代理模式:为其他对象提供一种代理,以控制对这个对象的访问。
查看全部 -
@设计模式——代理模式——了解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();
查看全部 -
概念及分类:为其他对象提供一种代理以控制对这个对象的访问。代理对象起到中介作用,可去掉功能服务或增加额外的服务。
代理模式的分类:
远程代理:为不同地理的对象,提供局域网代表对象。
虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建。
保护代理:控制对一个物品的访问权限。
智能引用代理:额外其他的服务
查看全部 -
动态代理 对另一个对象的引用查看全部
-
静态代理:代理和被代理对象在代理之前是确定的.他们都实现相同的接口或者继承相同的抽象类.
静态代理的两种实现方式:
1.继承方式
不建议使用,如果使用继承则会造成代理类无限叠加下去
2.聚合方式
代理之间可以相互传递,互相组合,提高代理的复用性
查看全部 -
cglib 动态代理
查看全部 -
代理模式这种机制可以叫做AOP,在不改变原有代码的基础上,添加或者删除某些方法 例如: 要调用某个jar包中某个类的方法,但是不能改变源码,我们可以采用JDK的动态代理模式,在该方法的前后添加业务逻辑,如记录日志,权限控制等
查看全部 -
完善动态代理实现 首先得到系统编译器,通过编译器得到文件管理者,以获取文件,然后编译器执行编译任务,完成编译之后,将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());
查看全部 -
动态代理实现思路 实现功能;通过Proxy的newProxyInstance返回代理对象 1.声明一段源码(动态产生代理) 2.编译源码(JDK Compiler API),产生新的类(代理类) 3.将这个类load到内存当中,产生一个新的对象(代理对象) 4.return 代理对象
查看全部 -
静态代理:继承、聚合 动态代理:JDK、cglib JDK动态代理:只能对实现了接口的类实现代理 ,没有接口就不能实现JDK动态代理 CGLIB动态代理:针对类产生子类,通过方法拦截技术拦截所有的父类方法的调用
查看全部 -
@设计模式——代理模式——了解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();
查看全部 -
@设计模式——代理模式——静态代理的实现 1、聚合代理优于继承代理。因为实现功能叠加的情况下,聚合代理通过相互代理可以实现功能重用,而继承代理必须写多个类来实现多功能叠加。 2、但静态代理只能代理一种类型的被代理类,换个类型的就不行了,这需要动态代理
查看全部 -
一、静态代理 1、静态代理:代理和被代理对象在【代理之前】都是【确定】的。他们都实现【相同的接口或者继承相同的抽象类】 2、代理实现方法: (1)继承法:代理类直接【继承】被代理类,实现其原有方法,并添加一些额外功能 (2)聚合方法:代理类实现【相同的功能接口:很重要,事项相同接口,不同代理也可以进行相互代理】,并在内声明一个被代理类的对象(类似封装),通过内部对象实现其原有方法,并添加额外功能
查看全部 -
代理模式 1、概念:为其他对象提供一种代理,以控制对这个对象的访问(例如火车站代售处)。代理对象起到中介作用,可去掉功能服务或增加额外的服务。 2、分类:a、远程代理---为不同地理的对象提供局域网代表对象。(类似于客户端和服务器端) b、虚拟代理---根据需要将资源消耗很大的对象进行延迟,真正需要的时候才进行创建。(网页中 图片的加载,先用一张虚拟的图片进行显示,等图片加载完成后再进行显示) c 、保护代理---控制用户的访问权限。(发帖功能) d、智能应用代理---提供对目标对象一些额外的服务。(火车站)
查看全部
举报