1. 反射
1.1 什么是反射?
在程序运行状态中,对于任意一个类可以获得它的属性和方法,对于任意一个对象可以调用它的属性和方法,这种动态获取类的信息和调用对象的功能成为反射。
1.2 使用反射的步骤
获取Class类对象的三种方法:
(1) 类.class()
(2) 对象.getClass()
(3) Class.forName()
注:一个类的类对象,在内存中是唯一的
根据Class类对象获取属性,方法对象:
(1) 获取字段对象:getFields(), getDeclaredField(), getField();
(2) 获取方法对象:getMethod(), getMethods(), getDeclaredMethod();
调用方法:invoke(对象名,参数);
注:getDeclaredXXX可以得到类中声明的全部信息,但是要调用私有的方法或者修改似有字段时要先调用对象.setAccessible()方法
2. 网络编程
2.1 网络编程的三大要素
(1) ip地址,ip地址能够进行网络通讯的一个设备的标识,ip地址用二进制来表示,分为两大类,ipv4和ipv6,ipv4为4个字节32位,ipv6为16个字节128位
(2) 端口, 端口号是应用程序的标识,端口号取值范围0-65535,0-1023端口已经被占用,一般我们使用1024-49151的端口号
(3) 协议, 协议是计算机进行网络通讯的一种规则,它对数据的传输格式,传输效率,传输步骤做了统一的规定,通信双方必须同时遵守才能完成数据交换,常见的网络协议为TCP和UDP
2.2 URL
URL是统一资源定位符,用于指向网上资源的指针。
一个标准的URL包括:协议,主机,端口,路径,查询参数,锚点
如http://www.google.com:80/index.html
2.3 UDP协议
UDP是无连接通讯协议,在传输数据时,数据的发送端和接收端不建立逻辑连接。
UDP协议消耗资源少,通讯效率高,通常用于音频,视频和普通数据的传输
使用步骤:
发送端:
1.创建数据报套接字对象:
DatagramSocket datagramSocket = new DatagramSocket(SocketAddress对象);
2.创建数据报包对象:
DatagramPacket datagramPacket = new DatagramPacket(数组,长度);
3.调用datagramSocket.send(datagramPacket);
4.关闭发送端
接收端:
1.创建数据包套接字对象:
DatagramSocket datagramSocket = new DatagramSocket(端口);
2.创建数据报包对象:
DatagramPacket datagramPacket = new DatagramPacket(数组,长度);
3.调用datagramSocket.receive(datagramPacket);
4.关闭接收端
2.4 TCP协议
TCP是面向连接的通讯协议,即在传输数据前后建立逻辑连接,然后再传输数据,它的数据传输可靠无差别的。
使用步骤:
发送端:
1.建立套接字对象:Socket socket = new Socket(ip地址,端口号);
2.使用写入流将数据写入Socket的写入传输流中
BufferedOutputStream bos=new BufferedOutputStream(new InputStreamReader(socket.getInputStream()));
3.调用bos的写方法
4.关闭流
接收端:
1.建立套接字对象:Socket socket = new Socket(端口);
2.使用读取流将Socket的输出传输流的东西读取出来:
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream));
3.调用bis的读方法
4.关闭流
2.5 UDP和TCP的区别
UDP是无连接的,不可靠的数据传输;TCP是面向连接的,可靠的数据传输
UDP是数据不安全的,缺乏数据校验:TCP是数据安全的,有数据校验
UDP的传输效率高,TCP的效率低
3. 枚举和泛型
3.1 枚举
枚举是一个被命名的常量的集合,它继承了java.lang.Enum类,枚举中的每个常量成员都是该枚举的实例对象。
枚举中的常用方法:
valueOf(String) 将字符串转化成枚举类的实例
values() 得到该枚举类的枚举数组
ordinal()获取该枚举实例的序号
3.2 泛型
泛型是参数化的类型,对类型进行约束,在编译期起作用
使用:
1.泛型类,在类名的后面加上<T>
2.泛型方法,在权限修饰符和返回值类型中间加上泛型声明<T>
3.泛型通配符,在泛型中?为泛型的通配符,表示一种未知的数据类型,通常作为方法参数或者返回值类型
4.上边界泛型,下边界泛型:
上边界泛型:<? extends Xxx> 规定的数据类型只能是Xxx或者其子类
下边界泛型:<? super Xxx> 规定的数据类型只能是Xxx或者其父类
泛型擦除,泛型信息只存在于编译期间,泛型在编译期间规定了某种数据类型,但是在生成字节码文件时是不生成泛型信息的,一般会把泛型信息生成Object类,或者这是一个上边界泛型的话,生成上边界的数据类型
4. Lambda表达式
4.1 什么是LambdaLa
Lambda表达式是函数式接口,即一个接口中只有一个抽象方法,允许把这个方法作为一个参数传入一个方法中。
4.2 Lambda表达式怎么用
基本格式:
1.要有一个函数式接口,即一个接口中只有一个抽象方法
2. () -> {}
当方法参数为0个或者多个时,要写小括号,当方法中的参数只有一个时,可以把小括号省略,只写参数名
当方法体里只有一条语句时,可以将大括号省略
4.3 常用的函数式接口
1. 功能型接口:Function<T,R>,T是方法的传入参数,R是方法的返回值
2. 消费型接口:Consumer<T>,该接口的方法有传入参数,没有返回值
3. 供给型接口:Supplier,该接口方法没有传入参数,有返回值
4. 断言型接口:Predicate<T>,该接口方法有传入参数,有boolean值的返回类型