-
动态代理实现步骤查看全部
-
jdk动态代理中的invactionhandler接口查看全部
-
jdk动态代理中的proxy动态代理类查看全部
-
@设计模式——代理模式——静态代理的实现 1、聚合代理优于继承代理。因为实现功能叠加的情况下,聚合代理通过相互代理可以实现功能重用,而继承代理必须写多个类来实现多功能叠加。 2、静态代理只能代理一种类型的被代理类,换个类型的就不行了,这需要动态代理 静态代理的两种实现方式对比(继承方式和聚合方式) 案例--代理类功能的叠加 1. 继承的方式:如果使用继承的方式来实现我们代理功能的叠加,我们的代理类会无限的膨胀下去。 2. 聚合的方式: 由于代理类和被代理类都实现了相同的接口,那么代理类的构造参数就可以传入该相同的接口,这样在后面功能叠加的时候就可以传入其他功能的代理类,因为他们都实现了相同的父接口。从而达到功能叠加的作用。 eg: 先记录日志再记录时间 Car car = new Car(); CarTimeProxy ctp = new CarTimeProxy(car); CarLogProxy clp = new CarLogProxy(ctp); clp.move(); 先记录时间再记录日志 Car car = new Car(); CarLogProxy clp = new CarLogProxy(car); CarTimeProxy ctp = new CarTimeProxy(clp); ctp.move(); 聚合的方式比继承的方式灵活很多,通过聚合的方式,代理之间也是可以相互传递的,相互组合。查看全部
-
@设计模式——代理模式——静态代理的概念 一、静态代理 1、静态代理:代理和被代理对象在【代理之前】都是【确定】的。他们都实现【相同的接口或者继承相同的抽象类】 2、代理实现方法: (1)继承法:代理类直接【继承】被代理类,实现其原有方法,并添加一些额外功能 (2)聚合方法:代理类实现【相同的功能接口:很重要,事项相同接口,不同代理也可以进行相互代理】,并在内声明一个被代理类的对象(类似封装),通过内部对象实现其原有方法,并添加额外功能查看全部
-
代理模式 1、概念:为其他对象提供一种代理,以控制对这个对象的访问(例如火车站代售处)。代理对象起到中介作用,可去掉功能服务或增加额外的服务。 2、分类: a.远程代理---为不同地理的对象提供局域网代表对象。(类似于客户端和服务器端) b.虚拟代理---根据需要将资源消耗很大的对象进行延迟,真正需要的时候才进行创建。(网页中图片的加载,先用一张虚拟的图片进行显示,等图片加载完成后再进行显示) c.保护代理---控制用户的访问权限。(发帖功能) d.智能应用代理---提供对目标对象一些额外的服务。(火车站)查看全部
-
笔记啊查看全部
-
看的啊查看全部
-
概念:为其他对象提供一种代理以控制对这个对象的访问。 代理对象起到中介作用,可以去掉功能服务或者增加额外服务。 静态代理:代理和被代理对象在代理之前是确定的。他们都是实现相同的接口或者继承相同的抽象类。有继承和聚合两种方式,聚合优于继承,如果用继承那么代理类会无限膨胀 动态代理:所谓的Dynamic Proxy是这样一种class: 它是在运行时生成的class 该class需要实现一组interface(接口) 使用动态代理类时,必须实现InvocationHandler接口 动态代理实现步骤: 1、 创建一个实现接口InvocationHandler的类,它必须实现invoke方法 2、 创建被代理的类以及接口 3、 调用Proxy的静态方法,创建一个代理类 newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) 4、 通过代理调用方法 动态代理的应用:AOP编程(面向切面编程),在不改变原有类的方法基础上,增加一些额外的业务逻辑。 JDK动态代理与CGLIB动态代理区别 JDK动态代理:1、只能代理实现了接口的类 2、没有实现接口的类不能实现JDK的动态代理 CGLIB动态代理:1、针对类来实现代理的 2、对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用查看全部
-
总结回顾: 1、代理概念、分类及应用场景 为其他对象设置总代理,以控制对这个对象的访问; 代理对象起到了中介的作用,去掉了某些功能,或增加了些额外的服务。 四类: Remote Proxy,客户端服务器的模式 Virtual Proxy,资源消耗很大,或复杂的对象,需要延迟,需要时创建, Protect Proxy, 保护和控制权限 Smart Reference Proxy,提供额外服务。 为什么只讲智能引用代理? 使用得多:日志处理、权限管理、事务处理... 静态代理(继承、聚合) JDK动态代理实现日志处理的功能 模拟JDK动态代理实现:在代理类Proxy和被代理类RealSubject之间,加入了invocationHandler。 调用jar包中某个类的方法,不能改源码,AOP面向切面,增加额外事务逻辑。查看全部
-
上一讲到代理,内部的业务逻辑是硬编码的,如何实现真正的动态代理,动态的指定业务逻辑呢? ①需要创建一个事务处理器,首先创建一个接口也就是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 传进去,然后更改创建实例对象中硬编码的部分用事务处理器方法替代即可。难点在于字符串的拼接。查看全部
-
完善动态代理实现:首先得到系统编译器,通过编译器得到文件管理者,然后获取文件,然后编译器执行编译任务,完成编译之后,将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());查看全部
-
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; } }查看全部
-
JDK动态代理 1. 目的:动态产生代理,实现对【不同类】,【不同方法】的代理 2. java动态代理类,位于java.lang.reflect包下,一般涉及两个类: (1)Interface InvocationHandler:该接口中仅定义了一个方法public object invoke(Object obj,Method method,Object[] args):实际使用中,obj指被代理类的对象,method指被代理的方法,args为该方法参数数组。这个抽象方法在代理类中动态实现。实现该接口即为代理的事务处理器。 (2)Proxy:该类即为动态代理类: static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理类的一个实例,返回后的代理类可以被当作代理类使用(可使用被代理类的在【接口中】声明过的方法)。第一个参数loader为被代理类的加载器,通过被代理类.getClass().getClassLoader()得到 · 第二个参数interfaces为被代理类实现的所有接口,同样通过getClass().getInterfaces()得到 · 第三个参数handler就是自己实现的InvocationHandler的实现类的对象 3. 动态代理实现: 1) 声明一个代理h实现InvocationHandler接口,通过【构造方法接受被代理类】,并实现invoke方法,添加业务逻辑(实现原有功能并添加额外功能) 2) 在测试类中,通过共同实现接口的实例获得代理对象,并实现方法,如Interface1 i = (Interface1)Proxy.newProxyInstance(classLoader,classInterfaces,h); 3) 通过动态代理对象m,代用其方法i.fun();查看全部
-
jdk动态代理中的proxy动态代理类查看全部
举报
0/150
提交
取消