ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:639.15KB ,
资源ID:9969175      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9969175.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(day47基础加强注解+动态代理+类加载器.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

day47基础加强注解+动态代理+类加载器.docx

1、day47基础加强注解+动态代理+类加载器Day47_基础加强今日内容介绍案例:1. 自定义注解模拟Test2. 使用动态代理解决网站的字符集编码注解(取代xml文件)、动态代理(对方法进行增强)、类加载器ClassLoaders(获取资源文件)今日内容学习目标1. 能够说出注解概述(定义、作用)2. 能够说出JDK自带注解作用(3种)3. 够定义自定义注解(了解)4. 够使用自定义注解(重点掌握)5. 够解释元注解Retention的各使用值的作用6. 够解释元注解Target 的各使用值的作用7. 够对动态代理技术进行描述(掌握动态的使用!)【动态代理里面涉及的一些参数】8. 能够对类加载

2、进行描述(类加载的作用,常见的类加载的分类,全盘委托机制)一、自定义注解模拟Test1.回顾Test操作对Test注解的要求: 方法签名:必须是 public void 非static 无参数运行时:所有被Test修饰的方法,都会被执行!需求:现在想自己写一个MyTest 来执行类似于Test的效果!我们需要学习注解相关的知识!2.相关知识点2.1 注解概述2.1.1 注解的概念Annotation注解,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。注解就是告诉程序,我所修饰的代码是如何执行的! 注释:注释是给开发人员阅读的,程序是无法进行解析

3、的。 注解:给程序看的2.1.2 注解的作用: 编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。例如:Override 代码分析:通过代码里标识注解,对代码进行分析,从而达到取代xml目的。 代码的抽取过程: 1、把运行了两次以上的代码进行合并为一个工具(方法,类)2、把工具中异常进行处理3、把工具的固定值,变为变量(使用配置文件)4、变量-常量5、常量-配置文件 xml properties6、配置文件-注解 xxx(class=,url=,xxx=)研发中的意义:如果项目特别大,配置文件也会极多,配置文件内容也会特别多,不好进行维护。可以用注解缓解 编写文档:通过代码里标识注

4、解,辅助生成帮助文档对应的内容2.2 JDK常用注解介绍2.2.1 Override 标记方法重写。标记父类的重写(JDK5.0),标记接口方法的实现重写(JDK6.0)会在程序的源码-预编译阶段进行重写检查,如果发现方法不是重写,那么在源码-预编译时期报错 注意:它只能标注在方法上Servlet中,可以重写父类HttpServlet里面的方法!被Override注解标记的方法的要求是:方法签名必须与父类或者父接口完全一样!修饰的方法=父类和父接口!2.2.2 SuppressWarnings 压制警告会在程序的源码-预编译阶段进行警告的压制。一般使用:SuppressWarnings(all

5、)注意:它可以标注方法,变量,类上压制警告的使用:开发时,要把所有的警告压制,防止被警告打乱开发思路 测试时,要把压制警告去掉,警告机制开启,这样方便测试rawtypes ,忽略类型安全(泛型未指定类型)unused , 忽略不使用(定义变量未使用)unchecked ,忽略安全检查null,忽略空指针(为空变量继续调用方法)all,忽略所有2.2.3 Deprecated 标记方法过时会在程序的源码-预编译阶段开始起作用。告知程序我所写的方法是过时,如果有程序员调用这样的过时方法,会报过时的警告。即使调用了过时方法,过时方法也正常执行 过时方法存在问题(安全问题)2.3 自定义注解2.3.1

6、 注解本质注解本质是一个接口(查看源代码得知)在定义的注解中有方法(String value()我们换一个名字:属性String value(),如下图value=all2.3.2 注解的属性赋值属性的类型: 基本、String 类型、Class类型、枚举类型、注解类型、数组演示:创建一个注解My1编写测试类其中枚举类型和注解类型需要自己单独定义:要求: 能根据指定注解给自己的类里面的方法(添加了注解)把值赋值成功!2.3.3 注解的赋值特殊情况 如果注解中,只有一个属性,并且名字叫value,赋值可以忽略属性名 属性如果没有默认值,使用时必须赋值 赋予默认值,使用就就不用赋值了, 如果赋值,

7、就会覆盖默认值 赋予默认值,使用就就不用赋值了, 如果赋值,就会覆盖默认值3.案例实现3.1 自定义注解步骤1、 定义注解 写一个注解interface 【研发】2、 使用注解 MyTest 【开发】3、程序解析,并执行注解写反射代码 【研发】最终封装成工具类(如JUnit)Junit它个干了两件事: 它创建了一个注解 Test 它是调用反射的代码执行了这个注解关注的是使用注解4、要想使用isAnnotationPresent 必须规定 注解是在运行阶段起作用 以下两个注解是专门修饰注解Target(TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LO

8、CAL_VARIABLE) Retention(RetentionPolicy.SOURCE)专门修饰注解的注解 叫做:元注解Target规定注解能够修饰在哪个地方 一般都是 Method 非必须Retention规定注解在哪个阶段起作用 一般都是 RetentionPolicy.RUNTIME 必须规定的强制元注解3.2 案例代码第一步:不用写属性,Test也木有!第二步:第三步:第四步:二、使用动态代理解决网站的字符集编码1.案例需求以及动态代理引入学习过滤器时,我们使用“装饰者”对request的getParameter()方法进行增强,从而使get和post使用 request.get

9、Parameter()获得的数据都没有乱码。本案例我们将使用一个全新的技术动态代理,对“统一GET和POST乱码”案例进行重写。1.1 回顾装饰者解决乱码问题使用装饰者完成中文乱码问题1.1.1 编写JSP页面1.1.2 编写servlet1.1.3 编写过滤器先解决post请求然后测试,post提交已解决,get依旧存在问题1.1.4 使用装饰者完善HttpServletRequest1.1.5 再次修改过滤器测试问题得以解决!问题发现: 使用装饰者设计模式,有严重的不足之处!装饰者设计模式(静态代理,增强的是类) 优点:不用知道实现类是哪个,因为我增强的是这个接口下所有的实现类 不占用继承

10、位,方便后期程序扩展(相对继承) extends 固定步骤:增强类 实现 被增强类实现的 接口 增强类 获得 被增强对象的引用 构造方法 缺点: 如果接口中的方法过多,实现大量无关的方法。【对类增强】 如果只能获取到对象,那么我是无法知道类有哪些接口,就无法使用装饰者【必须明确所有的接口】如果只对某个方法进行增强,使用动态代理非常合适!2.相关知识点2.1 代理模式介绍2.2 动态代理对象介绍Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。 核心方法:参数介绍:三个参数全都是固定写法! 参数一:通过被增强对象获取类加载器(xxxx.class.g

11、etClassLoader) 参数二:通过被增强对象获取所有实现类的接口 参数三:动态代理的处理类,用于对方法的增强2.3 动态代理操作步骤固定步骤: 1、创建 被增强对象【被代理对象】 2、创建 增强对象 【代理对象】 2.1、通过被代理对象获取类加载器 被代理对象.getClass().getClassLoader() 2.2、通过被代理对象获取其所有的接口 被代理对象.getClass().getInterfaces() 2.3、创建一个处理类 【专门用来增强方法】动态代理只对接口里面的方法进行增强,实现类的不曾强!(我们实现动态代理压根儿不知道它的实现类)2.4 动态代理演示2.4.1

12、 创建接口2.4.2 创建实现类2.4.3 创建处理类测试:增强的方法被调用。调用之前的方法:发现动态代理与之前的类一点关系都没有!2.5 动态代理多方法执行以及return说明再次改进代码2.5.1 修改接口动态代理:接口中没有的方法,动态代理是没法增强的!2.5.2 修改被增强对象2.5.3 修改处理类Return是增强方法的返回值2.6 动态代理处理带参的方法2.6.1 修改接口2.6.2 修改被增强对象2.6.3 修改处理类2.7 动态代理针对某个方法增强只需要修改处理类,加个判断即可2.8 动态代理与静态代理区别1、静态代理 代理的是类 创建一个增强类【代理类】2、动态代理 代理的是

13、对象 创建一个增强对象【代理对象】1、 静态代理(工作量极大) 要实现所有接口中的所有方法全部实现。 工作量极大 需要知道具体的接口名字。通过class找所有接口。工作量极大2、动态代理(灵活,工作量极小) 只需要被代理对象3.案例代码实现修改过滤器代码4.总结(类加载器) 类加载器:类加载器是负责加载类的对象。将class文件(硬盘)加载到内存生成Class对象。作用:类加载器负责将class文件加载到内存生成对应的Class对象! 所有的类加载器 都是 java.lang.ClassLoader 的子类 引导类加载器:BootStrapClassLoader 它加载的是Javajdk1.7

14、.0_72jrelibrt.jar! JDK工具返回null 扩展类加载器:ExtClassLoader 它加载的是jdk1.7.0_72jrelibext*.jar 应用类加载器:AppClassLoader 它加载的是 程序员自己编写的文件 使用 类.class.getClassLoader() 获得加载自己的类加载器 类加载器加载机制:全盘负责委托机制 全盘负责:A类如果要使用B类(不存在),A类加载器C必须负责加载B类。 委托机制:A类加载器如果要加载资源B,必须询问父类加载是否加载。 如果加载,将直接使用。 如果没有机制,自己再加载。 采用 全盘负责委托机制 保证 一个class文件

15、 只会被加载一次,形成一个Class对象。packagecom.itheima.web.filter;import java.io.IOException;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.

16、ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;publicclassEncodingFilterimplements Filter publicvoid destroy() publicvoid doFilter(ServletRequest req, ServletResponse

17、 resp, FilterChain chain)throws IOException, ServletException /1.强转(创建一个被代理对象!)/【动态代理不用单独去创建其它的对象!(它只对接口里面的里面的方法增强,使用的对象是接口的默认实现类);装饰者是需要单独创建一个类去实现默认实现类的父接口或者继承默认实现类父接口的包装类】final HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp;/2.处理响应的

18、中文乱码response.setContentType(text/html;charset=utf-8);/3.创建一个代理对象/* * 第一个参数:通过被代理对象获得的类加载器(负责将字节码文件加载到内存,生成对应的class对象!) * 第二个参数:通过被代理对象获得的接口(动态代理只能对接口里面的方法进行增强!) * 第三个参数:创建代理对象的方法!(要执行代理对象了里面的代码!必须放到方法里面!创建一个代理对象专门执行功能的一个对象) */ HttpServletRequest proxyReq = (HttpServletRequest) Proxy.newProxyInstance

19、(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() /* * 第一个参数:代理对象(没啥卵用!) * 第二个参数:被代理对象里面的方法对象!(希望在代理对象中调用被代理对象里面的原有核心功能!) * 第三个参数:被大理对象里面的方法对象的参数对象! * 方法的返回值:它不太确定被代理的那个方法的返回值类型!干脆给Object(通过调用的方法的return来返回被代理对象里面方法的返回值!) */Overridepublic Object invoke(

20、Object proxy, Method method, Object args) throws Throwable /只对getParameter方法进行增强!if(method.getName().equals(getParameter)/获得请求方式(靠被代理对象) String method1 = request.getMethod();/判断用户的请求方式if(method1.equalsIgnoreCase(POST)/说明是POST请求(增强的功能!)request.setCharacterEncoding(utf-8);/执行原有功能(调用的是被代理对象里面的方法!它就requ

21、est.getParameter(username))【args它就是username】returnmethod.invoke(request, args); elseif(method1.equalsIgnoreCase(GET)/说明是GET请求,执行原有功能!(原有核心功能!) String par = (String) method.invoke(request, args);/增强!par = new String(par.getBytes(iso8859-1),utf-8);/返回returnpar; else/说明是其它请求方式returnmethod.invoke(request, args); else/其它方法,执行执行returnmethod.invoke(request, args); );/放行的必须是代理对象!chain.doFilter(proxyReq, response); publicvoid init(FilterConfig fConfig) throws ServletException

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1