本周学习了反射、静态代理、Proxy动态代理;注解、自定义注解以及元注解;response对象与request对象,以及操作请求头、响应头,请求行、响应行,响应正文及请求参数。
反射
类加载
- 加载:就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。
- 加载时机:
- 创建类对象的实例
- 访问类的静态变量,或者为静态变量赋值
- 调用类的静态方法
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
类加载器
- 概念:负责将.class文件加载到内存中,并为之生成对应的Class对象。
- 类加载器的分类
- Bootstrap ClassLoader:根类加载器
- Extension ClassLoader:扩展类加载器
- Sysetm ClassLoader:系统类加载器
类反射机制
- JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
- 对于任意一个对象,都能够调用它的任意一个方法和属性
- 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
- 三种方式:
- Class.forName(“全类名”)
- 类名.class
- 对象名.getClass()
反射操作
- 反射操作构造器
- 反射操作成员变量
- 反射操作成员方法
- 反射越过泛型(setAccessible(true))
静态代理设计模式
- 自定义类实现和被代理类相同的接口
- 在代理类中声明被代理类的对象
- 在代理类的方法中使用被代理类调用方法
装饰者设计模式
- 定义装饰类(增强类)实现和被装饰类(被增强类)相同的接口
- 在装饰类中声明被装饰类的引用
- 在装饰类的方法中,使用被装饰调用原方法
Proxy动态代理
- 动态代理:在程序运行过程中产生的这个代理对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理
- 原理:在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更 强大的代理cglib,Proxy类中的方法创建动态代理类对象
- 方式一:定义类实现InvocationHandler接口
- 方式二:使用InvocationHandler接口的匿名内部类对象
连接池
自定义连接池
- 初始化时,创建一些连接对象,并存储到LinkedList集合中
- 从连接池中取出连接
- 把连接归还连接池
注解
内置注解
- @Override
- @Deprecated
- @SuppressWarings
注解分类
- 标记注解:没有参数的注解
- 单值注解:只有一个参数的注解
- 完整注解:注解中有多个属性
自定义注解
- public @interface 注解名 {
数据类型 属性名1() default 默认值1;
数据类型 属性名2();
} - 可以使用注解替代jdbc.properties配置文件
元注解
- 用于负责描述其他注解的注解
- 作用在自定义注解上,规定自定义注解的作用区域、存活策略
- @Target:规定自定义注解的作用区域
- @Retention:规定自定义注解的存活策略
request与response对象
response对象
- response对象处理响应信息(响应行、响应头、响应正文)
- response对象操作响应行、响应头
- setStatus:操作正常响应状态码,比如:200、302
- sendError:操作错误响应状态码,比如: 404
- setHeader:直接覆盖响应头原有值
- addHeader:在响应头原有值的后面追加
- response操作重定向
- 重定向的流程:
- 当浏览器访问一个资源Demo03Servlet,访问名称为“/demo03”
- Demo03Servlet进行重定向
- 浏览器进行一个新的请求,完成重定向
- response操作定时跳转:一个资源定时一段时间之后,跳转到另外一个资源
- 操作响应头refresh
- responce操作响应正文:浏览器显示的主体内容
- response.getWriter().write():操作响应正文
- setCharacterEncoding(“utf-8”)
- setHeader(“Content-Type”,“text/html;charset=utf-8”)
- setContentType(“text/html;charset=utf-8”)
request对象
- request操作请求行:
- getRequestURI:获取请求路径
- getMethod:获取请求方式
- getRemoteAddr:获取请求ip
- getLocalPort:获取请求端口
- getQueryString:请求网址"?"后面的路径
- request操作请求头:
- getHeader():获取指定请求头的值
- request操作请求参数:
- getParameter:获取指定请求参数值
- getParameterNames:获取所有请求参数名称
- getParameterValues(String parameterName):获取指定请求参数所有值
- getParameterMap
request操作请求转发
- 服务器中,从一个资源跳转到另外一个资源
- 流程:
- 浏览器发起请求,请求Demo01Servlet
- Demo01Servlet,请求转发到Demo02Servlet
- 在服务器内部,直接从Demo01Servlet跳转到了Demo02Servlet
- 转发只有一次请求
请求转发与重定向的区别
- 请求次数
- 跳转区别
- 路径区别
request域对象
- 可以存储数据的对象
- request对象的生命周期:发起请求时,request初始化;响应时,request销毁
- request域对象的作用范围在一次请求中
- request在重定向和转发中使用:
- 重定向中不能使用request域对象
- 转发中可以使用request域对象