-
3、将这个类load到内存当中,产生一个新的对象(代理对象); //load到内存 ClassLoader cl = ClassLoader.getSystemClassLoader(); Class c = cl.loadClass(“com.imooc.proxy.$Proxy0”); Constructor ctr = c.getConstructor(infuse);//传入接口参数 ctr.newInstance();//产生代理类的对象 4、return代理对象。 JDK动态代理,只能代理实现了接口的类,没有实现接口的类不能实现JDK的动态代理。 CGLIB动态代理,针对类来实现代理,对指定目标类产生一个子类,通过方法拦截技术拦截所有父类方法的调用。查看全部
-
动态代理实现思路 实现功能:通过newProxyInstance返回代理对象, 1、声明一段源码(动态产生代理); 将源码注释掉存到一个str里; 可以创建事务处理器,动态处理业务逻辑,见3.3节; 写个继承自InvocationHandler的子类,将逻辑放在invoke方法中,两个参数(类对象和方法) 给newProxyInstance多一个参数InvocationHandler; 在str中还要把它的import引入加上。 2、编译源码(JDK Compile API),产生新的类(代理类); 通过java文件编译,String filename = System.getProperty(“user.dir”) + “/bin/com/imooc/proxy/$Proxy.java”; File file = new File(filename); 加入jar包,common-o.jar , 快速对文件进行读写删除操作。 FileUtils.writeStringToFile(file, str); 实现对任意对象任意接口。。。 //拿到编译器 JavaCompiler complier = ToolProvider.getSystemJavaCompiler(); //文件管理者 StandardJavaFileManager fileMgr = complier.getStandardFileManager(null,null,null);//diagnosticListener, locale,charset //获取文件 Iterable units = fileMgr.getJavaFileObjects(filename); //编译任务 CompilationTask t = complier.getTask(null, fileMgr, null,null,units); //进行编译 t.call(); fileMgr.close();查看全部
-
动态产生代理,实现对不同类、不同方法的代理。 使用JDK动态产生代理(测试代码Client类): Proxy.newProxyInstance(loader, interfaces, h); 参数1:类加载器;参数2:实现接口;参数3:InvocationHandler时间处理器。 测试示例: Car car = new Car(); InvocationHandler h = new TimeHandler(car); Class<?> cls = car.getClass(); Moveable m = (Moveable)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h); m.move()查看全部
-
静态代理:聚合+继承 聚合:在一个类中调用另一个对象,把参数传入进来,执行其业务逻辑。 聚合比继承更适合代理模式 实现功能叠加,增加日志处理、增加权限管理、在move方法外层添加方法实现运行时间处理功能、实体对象方法move。 如果用继承方式实现功能叠加,代理类将无限叠加下去。查看全部
-
总结回顾: 1、代理概念、分类及应用场景 为其他对象设置总代理,以控制对这个对象的访问; 代理对象起到了中介的作用,去掉了某些功能,或增加了些额外的服务。 四类: Remote Proxy,客户端服务器的模式 Virtual Proxy,资源消耗很大,或复杂的对象,需要延迟,需要时创建, Protect Proxy, 保护和控制权限 Smart Reference Proxy,提供额外服务。 为什么只讲智能引用代理? 使用得多:日志处理、权限管理、事务处理... 静态代理(继承、聚合) JDK动态代理实现日志处理的功能 模拟JDK动态代理实现:在代理类Proxy和被代理类RealSubject之间,加入了invocationHandler。 调用jar包中某个类的方法,不能改源码,AOP面向切面,增加额外事务逻辑。查看全部
-
代理模式: 1、远程代理 为不同地理的对象提供局域网代表对象。 2、虚拟代理 根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建。 3、保护代理 控制用户使用的权限,例如普通用户没有注册只能浏览,注册后才能发帖、删除、评论。 4、智能引用代理(静态代理+动态代理) 提供对目标对象额外的功能。查看全部
-
jdk动态代理的实现步骤查看全部
-
JDK动态代理与CGLIB动态代理的区别查看全部
-
代理模式: 1、聚合代理优先于继承代理。因为实现功能叠加的情况下,聚合代理通过相互代理的方式可以实现功能的重用,但是如果使用继承代理的话需要不断地增加代理类,这将导致代理类的数量无限膨胀; Car car = new Car(); CarLogProxy clp = new CarLogProxy(car); CarTimeProxy ctp = new CarTimeProxy(clp); //CarTimeProxy ctp = new CarTimeProxy(car); //CarLogProxy clp = new CarLogProxy(ctp); 2、静态代理只能代理一种类型的被代理类,换个类型的就不行了,这需要动态代理;查看全部
-
代理模式实现-静态代理查看全部
-
动态代理实现步骤查看全部
-
JDK动态代理与CGLIB动态代理区别查看全部
-
动态代理的实现步骤查看全部
-
代理模式的实现-静态代理查看全部
-
智能代理的两种实现方式查看全部
举报
0/150
提交
取消