网络
Internet地址
IP–>Internet Protocol网络协议
所有连接到Internet的设备都看做一个节点(node),计算机节点叫主机(host),每个节点或主机都由至少一个唯一的数标识–>Internet地址(IP地址)—>网络号+主机号=IP地址
IPv4–>4个字节长度的IP地址
IPv6–>6个字节长度的IP地址
域名解析DNS
www.baidu.com,网址叫域名,通常通过域名进行访问,访问过程中先去DNS服务器找域名"www.baidu.com" 所对应的IP地址,然后通过IP地址访问服务器–>域名—解析成—>IP 叫 DNS域名解析
Inetddress
URL、URI
URL可以唯一地标识一个资源在Internet上的位置
URI可以由资源的网络位置来标识资源–>资源的名称、编号
HTTP
超文本传输协议(Hypertext Transfer Protocol,HTTP)
定义了客户端如何与服务器对话,以及数据如何从服务器传回客户端,可以用来传输图片、文档
HTTP协议
HTTP是客户端和服务器之间通信的标准协议。
- 客户端在80端口打开与服务器的一个TCP连接
- 客户端向服务器发送信息,请求指定路径上的资源(请求包含一个首部、与请求的数据)
- 服务器向客户端发送响应,响应以响应码开头,后面是包含数据的首部、空行和所请求的文档或错误信息
- 服务器关闭连接
HTTP Request
请求或响应基本形式:一个首部行、一个包含元素数据的HTTP首部、一个空行,一个消息体
格式为
- 请求行,分为三部分:请求方法、请求地址、协议版本
GET/image/logo.gif HTTP/1.1从/image目录下请求logo.gif文件,协议版本1.1
- 请求头
- 请求方法
OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT
GET、POST
- GET提交的数据会放在URL之后,以 ? 分隔URL和传输数据,参数之间以 & 相连
- GET提交有数据大小限制,最多1024字节,POST方法提交的枚举没有限制
- GET方式提交数据,有安全问题—>账号密码暴露在URL上
HTTP Response
客户端向服务器发送请求,服务器以一个状态作为响应,响应内容为:消息协议的版本
、成功或错误的编码、服务器信息、实体元信息和必要实体内容
响应消息结构分三部分响应状态行
响应头
响应体
- 响应状态行
包含HTTP版本信息和状态码
状态码 | 对应信息 |
---|---|
1xx | 请求已接收,继续处理 |
2xx | 请求已成功接收、处理 |
3xx | 重定向 |
4xx | 客户端错误:请求语法错误/无法实现 |
5xx | 客户端错误,服务器无法实现合法请求 |
-
响应头Header
-
响应体
响应体就是请求的内容,一般在相应头中会用 Content-Length来明确相应体的长度,便于浏览器接受,对于大数据量的正文消息,也会使用 chunked 的编码方式
HTTPS
Hypertext Transfer Protocol over Secure Socket Layer—>HTTP+SSL层,HTTPS安全基础就是SSL
HTTPS、HTTP
- HTTPS需要ca申请证书
- HTTP超文本传输协议,信息明文传输;HTTPS安全性的SSL加密传输协议
- HTTPS连接端口443、HTTP连接端口80
- HTTP无状态连接、HTTPS协议由SSL+HTTP构成的可进行加密传输、身份认证的网络协议,比HTTP协议安全
HTTPS作用
- 建立信息安全通道–>提供可靠传输
- 确认网站真实性
注解
内置主机
- @Override重写
- @Deprecated
- @SuppressWarnings
按声明周期
RetentionPolicy.SOURCE/CLASS/RUNTIME
- SOURECE 编译时移除注解,不会出现在class文件中
- CLASS 注解包含在class文件中,运行时移除
- RUNTIME 注解保留到运行时,可在运行时通过反射解析到这个注解
元注解
-
Retention 注解声明周期(source、class、runtime)
-
Documented 文档话注解,倍javadoc工具文档化
-
Inherited 注解自动集成: 让类和他的子类都包含某个注解
-
Target 注解的应用范围
- TYPE 表示可以用来修饰的数据类型:类、接口、注解类型、枚举
- PACKAGE 修饰包
- PARAMETER 修饰参数
- METHOD 修饰方法
- FIELD 修饰属性
- CONSTRUCTOR修饰构造器
- LOCAL_VARLABLE 修饰局部变量
反射
反射属于:运行时类型识别:RTTI,Run-Time Type Identification
传统RTTI实现方式
- 向上转型或向下转型(强制类型转换)
- Class对象
- instanceof
反射与RTTI
传统RTTI编译期需要.class文件,而反射不需要
Class类
Class类—>类模板
java每个对象都有相应的Class类对象,有Class对象的存在,Java不会因为类型的向上转换而迷失,总能找到正确的Class类中所定义的方法–>多态的原理
获取Class类方式
- 对象实例.getClass()
- 类名.class
- Class.forName();
Class 类方法
Class类加载
- 创建类的对象时,Java首先检查内存是否有相应的Class对象
- 如果内存中没有相应Class对象,Java会在 .class文件中寻找类的定义,并加载类Class对象
- Class对象加载后,所有该类实例都参照该Class对象
反射相关类
-
Constructor
-
Method
- public Object invoke(Object obj, Object… args)方法取消检查权限后,便可以invoke执行了
-
Field
-
AccessibleObject是这三个类的基类—>提供了将反射对象标记为在使用时取消默认的语言访问控制检查的能力
- setAccessible(boolean flag)是否取消Java语言访问检查–>暴力反射–>关闭Java访问权限检查
- isAccessible() 获取是否需要访问权限
new 与newInstance
- newInstance弱类型,只能调用无参构造器、new强类型、能调用任何public构造器
- newInstance本质是将new分解成两步,首先调用Class加载方法加载该类,然后实例化
模糊查询 ABC—>AB*、A*C、*AB
耦合-内聚—Class.forName();
Class.forName("");的作用是要求JVM查找并加载指定的类,如果在类中有静态初始化器的话,JVM必然会执行该类的静态代码段 —> 只有用到该类的时候才将该类模板加载进来?
instance
newInstance
代理
一个真正的要访问的对象(目标类),一个代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象
静态代理
程序运行之前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了
被代理对象与代理对象一起实现共同接口或者继承相同父类—>是为了控制对象引用
同时实现类同接口/父类,代理对象代管被代理对象,在代理的方法中,调用被代理对象的方法,同时添加代理对象的个人方法
被代理类,不能修改实现类代码,便需要使用代理类===>开闭原则
- 可以做到不修改目标对象功能的情况下,扩展功能
- -->一旦接口增加方法,目标对象与代理对象都要维护
动态代理
将代理对象延时到程序运行时由JVM实现
JDK动态代理
增强类实现InvocationHandler接口,实现invoke方法,调用Proxy.newProxyInstance()
CGLIB
增强类继承MethodInterceptor类实现intercept方法,添加增强业务
实例化一个增强器Enhancer(),设置目标类,设置拦截对象,生成代理对象并返回实例
ClassLoader
类加载
若类还没有被加载内存中,JVM会通过加载、连接、初始化,3个步骤来对该类进行初始化
类型的加载、连接、初始化过程都是在程序运行期间完成的(类从磁盘加载到内存中经历的三个阶段)
类的生命周期
类加载器
类加载器负责加载所有的类,为所有被载入内存中的类生成一个java.lang.Class实例对象。同一个类不会被再次载入,并有一个唯一的标识(全限定类名+类加载器)
类加载器的任务就是根据一个类的全限定类名读取此类的二进制字节流到 JVM中,然后转换为一个与目标类对应的 java.lang.Class对象实例
加载器分为:启动类加载器Bootstrap、扩展类加载器Extension、系统类加载器System
启动类加载器BootstrapClassLoader,加载JVM自身所需类核心类库
扩展类加载器ExtensionClassLoader,负责加载jdk\jre\lib\ext目录
应用程序类加载器ApplicationClassLoader,负责加载项目工程所编写的类
getClass().getClassLoader()可以获得父类加载器,
但是Bootstrp Loader是用C++实现的,找不到一个确定的返回父Loader的方式,便返回null
- 数组类型
- 数组的类对象不是类加载器创建的,而是根据Java运行时的需要自动创建的
- 数组类的类加载器getClassLoader()与它的元素类型的类加载器相同
- 元素是基本类型,没有类加载器,不同于根加载器返回的null,就是单纯的null
- 元素时引用类型,类加载器与引用类型加载器一样
双亲委派
一个类加载器收到了类加载请求,首先不会自己尝试加载这个类,而是把请求委派给父加载器去完成,依次向上,直到被传递到底层的启动类加载器中,只有父加载器在它的搜索范围内没有找到所需的类时,子加载器才会尝试自己去加载该类
- Java类随着它的类加载器一起具备了带有优先级的层次关系,避免类的重复加载
- 保证Java程序安全稳定运行