-
代理模式定义查看全部
-
设计模式之代理模式查看全部
-
获取当前路径---System.getProperty("user.dir") FileUtils可以快速的对文件进行读写。查看全部
-
总结回顾: 1、代理概念、分类及应用场景 为其他对象设置总代理,以控制对这个对象的访问; 代理对象起到了中介的作用,去掉了某些功能,或增加了些额外的服务。 四类: Remote Proxy -- 客户端服务器的模式 Virtual Proxy -- 资源消耗很大,或复杂的对象,需要延迟,需要时创建, Protect Proxy -- 保护和控制权限 Smart Reference Proxy -- 提供额外服务。 为什么只讲智能引用代理? 使用得多:日志处理、权限管理、事务处理... 静态代理(继承、聚合) JDK动态代理实现日志处理的功能 模拟JDK动态代理实现:在代理类Proxy和被代理类RealSubject之间,加入了invocationHandler。 调用jar包中某个类的方法,不能改源码,AOP面向切面,增加额外事务逻辑。查看全部
-
上一讲到代理,内部的业务逻辑是硬编码的,如何实现真正的动态代理,动态的指定业务逻辑呢? 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 传进去,然后更改创建实例对象中硬编码的部分用事务处理器方法替代即可。难点在于字符串的拼接。查看全部
-
完善动态代理实现 首先得到系统编译器,通过编译器得到文件管理者,以获取文件,然后编译器执行编译任务,完成编译之后,将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动态代理区别查看全部
-
总结:【动态代理】 1.被代理对象首先要实现某些接口 2.它在运行时生成class对象(代理类),该class需要实现一组interface 3.产生的代理类并不能做什么事情,必须实现InvocationHandler接口来接管实际的工作 4.想实现的功能是在handler中去实现的 动态代理实现步骤: 1.创建一个实现接口InvocationHandler的类,它必须实现Invoke方法 2.创建被代理的类以及接口 3.调用proxy的静态方法,创建一个代理类 new ProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h); 4.通过代理调用方法查看全部
-
动态创建动态代理类的方法:查看全部
-
动态代理查看全部
-
静态代理:代理和被代理对象在代理之前是确定的。他们都实现相同的接口或者继承相同的抽象类。 1)继承方式实现代理:用car2继承car,调用父类的move()方法。 【前提是car实现了Moveable接口】 2)聚合方式实现代理:用car3实现Moveable接口,然后将car传入,调用car的move()方法。查看全部
-
代理模式定义: 为其他对象提供一种代理,以控制这个对象的访问。 远程代理:为不同地理的对象,提供局域网代表对象。 虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建。 保护代理:控制对一个对象的访问权限[访问或操作] 智能引用代理:提供对目标对象额外的其他服务。查看全部
-
一、JDK与CGLIB动态代理的区别 1、JDK:针对接口 · 只能代理【实现了接口的类】 · 没有实现接口的类不能实现JDK的动态代理 2、CGLIB:针对类 · 针对类来实现代理的 · 对指定目标类产生一个子类,通过方法拦截【技术拦截】所有父类方法的调用 二、CGLIB:是一个强大的开源项目,可以在运行期扩展Java类与实现Java接口 eg: //CglibProxy.java private Enhancer enhancer=new Enhancer(); /** * 创建代理类 */ public Object getProxy(Class clazz){ //设置创建子类的类 enhancer.setSuperclass(clazz); //设置回调 enhancer.setCallback(this); //创建子类的实例 return enhancer.create(); } /** * obj 目标类的实例 * m 目标方法的反射对象 * args 方法参数 * proxy 代理类实例 */ @Override public Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("日志开始..."); //代理类调用父类的方法 proxy.invokeSuper(obj, args); System.out.println("日志结束..."); return null; }查看全部
-
JDK动态代理 1. 目的:动态产生代理,实现对【不同类】,【不同方法】的代理 2. java动态代理类,位于java.lang.reflect包下,一般涉及两个类: (1)Interface InvocationHandler:该接口中仅定义了一个方法public object invoke(Object obj,Method method,Object[] args) 参数: obj:被代理类的对象 method:被代理的方法 args:被代理方法参数数组 返回值: Object:方法返回值 (2)Proxy:该类即为动态代理类: static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) 参数: loader:被代理类的类加载器,通过被代理类.getClass().getClassLoader()得到 interfaces:实现的接口,通过getClass().getInterfaces()得到 h:invocationHandler 返回值: 返回代理类的一个实例 3. 动态代理实现: (1) 创建一个代理h实现InvocationHandler接口,通过【构造方法接受被代理类】,并实现invoke方法,添加业务逻辑(实现原有功能并添加额外功能) (2) 在测试类中,通过共同实现接口的实例获得代理对象,并实现方法,如Interface1 i = (Interface1)Proxy.newProxyInstance(classLoader,classInterfaces,h); (3) 通过动态代理对象i,调用其方法i.move();查看全部
举报
0/150
提交
取消