Day11-15day11网络编程 UDP: User Datagram Protocol, 用户数据报协议 特点: 1. 无连接的不可靠协议 2. 数据按包发送, 64K一个包 3. 速度快效率高, 容易丢包 用于视频直播, 网络电话 TCP: Transmission Control Protocol, 传输控制协议 特点: 1. 需要建立连接的可靠协议 电话 2. 数据传输无大小限制 3. 速度慢效率低 重发机制 用于文件下载, 浏览网页 客户端代码实现:1.创建一个客户端对象 Socket, 构造方法传入服务器的IP地址和端口号 2.使用Socket对象中的方法 getOutputStream() 获取网络字节输出流OutputStream对象 3.使用网络字节输出流OutputStream对象中的方法 write(), 给服务器发送数据 4.使用Socket对象中的方法 getInputStream() 获取网络字节输入流InputStream对象 5.使用网络字节输入流InputStream对象中的方法 read(), 读取服务器回写的数据 6.释放资源(Socket) 解决阻塞问题:shutdownOutput();file:///E:/è§é¢/day11-导å¸èµæ/img/05_模æBSæå¡å¨åæ.bmp?lastModify=1543737704?lastModify=1543739625 今日APIjava.net.ServerSocket类: TCP服务端 // 构造方法 ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口 // 成员方法 Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象 void close(): 关闭服务端ServerSocket java.net.Socket类: TCP客户端 // 构造方法 Socket(String ip, int port): 创建TCP客户端对象 // 成员方法 OutputStream getOutputStream(): 获取输出流对象, 用于发送数据 InputStream getInputStream(): 获取输入流, 用于接收数据 void shutdownOutput(): 关闭输出流, 告知服务端数据发送完毕 void close(): 关闭客户端Socket day12函数式接口,接口中仅有一个抽象方法。@FunctionalInterface,在接口上使用, 检测当前的接口是否为函数式接口。Java中提供的常用 函数式接口: Supplier<T>: 生产型函数式接口 获取值 a和b的和, 获取数组最大值, 获取一个Person对象 Consumer<T>: 消费型函数式接口 使用值 给它一个String让他打印, 给它一个对象 Predicate<T>: 条件判断型函数式接口 判断值 判断字符串长度是否大于5 Function<T, R>: 转换型函数式接口 转换值 给它一个String转换为Integer "123"->123 今日APIjava.util.function.Supplier<T>函数式接口: 生产型函数式接口 // 抽象方法 T get(): 用于获取一个对象或值. 至于获取什么值, 怎么获取, 需要我们根据应用场景编写Lambda来实现 java.util.function.Consumer<T>函数式接口: 消费型函数式接口 // 抽象方法 void accept(T t): 用于消费(使用)一个对象或值. 至于怎么消费, 需要我们根据应用场景编写Lambda来实现 // 默认方法 default Consumer<T> andThen(Consumer<? super T> after): 拼接两个Consumer接口的Lambda对象实现连续操作. 谁写前面, 谁先消费 java.util.function.Predicate<T>函数式接口: 条件接口, 用于判断 // 抽象方法 boolean test(T t): 判断参数传递的对象. 至于怎么判断, 要判断什么, 需要我们编写Lambda表达式来实现 // 默认方法 (用于连接多个判断条件) default Predicate<T> and(Predicate<? super T> other): 与 default Predicate<T> or(Predicate<? super T> other): 或 default Predicate<T> negate(): 非, 取相反结果 java.util.function.Function<T,R>: 根据一个T类型的数据得到另一个R类型的数据 T称为前置条件, 也就是输入(input)的类型 R称为后置条件, 也就是返回结果(result)的类型 有进有出, 所以称为"函数Function" // 抽象方法 R apply(T t): 将T转换为R // 默认方法 default <V> Function<T, V> andThen(Function<? super R, ? extends V> after): 拼接多个Function转换 day13Stream.filter过滤,foreach遍历,可以链式。 获取Stream流对象的2种方式: 1. 利用"Collection接口"中的默认方法 default Stream<E> stream() 方法: 集合转Stream对象 2. 利用"Stream接口"中的静态方法 static <T> Stream<T> of(T... values): 数组转Stream对象 java.util.Collection<E>接口: // 默认方法 default Stream<E> stream(): 将"集合"转换为Stream对象 java.util.stream.Stream<T>接口: 管道接口, 泛型为流中元素的类型 // 静态方法 static<T> Stream<T> of(T... values): 将"数组"转换为Stream对象 创建数据源-> filter()过滤 | map()映射 | limit()截取 | skip()跳过 -> forEach() | count()结果 方法引用能简化以下场景: (方法名后不要写小括号) 1. 通过对象名引用成员方法 对象名::成员方法名 2. 通过类名引用静态方法 类名::静态方法名 3. 通过super引用父类成员方法 super::父类方法名 4. 通过this引用本类成员方法 this::本类方法名 5. 引用某个类的构造方法 类名::new 6. 引用创建数组的方法 数据类型[]::new 今日APIjava.util.Collection<E>接口: // 默认方法 default Stream<E> stream(): 将"集合"转换为Stream对象 java.util.stream.Stream<T>接口: 管道接口, 泛型为流中元素的类型 // 静态方法 static<T> Stream<T> of(T... values): 将"数组"转换为Stream对象 static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b): 合并两个流为新流 // 抽象方法 void forEach(Consumer<? super T> action): 遍历流中的元素进行逐一消费 (终结方法) long count(): 获取流中的元素个数 (终结方法) Stream<T> filter(Predicate<? super T> predicate): 过滤符合条件的结果. 返回过滤后的流 <R> Stream<R> map(Function<? super T, ? extends R> mapper): 将T元素转换为R元素, 返回新的流 Stream<T> limit(long maxSize): 从流中获取前maxSize个 Stream<T> skip(long n): 从流中跳过n个元素, 获取后面的元素 方法引用能简化以下场景: (方法名后不要写小括号) 1. 通过对象名引用成员方法 对象名::成员方法名 2. 通过类名引用静态方法 类名::静态方法名 3. 通过super引用父类成员方法 super::父类方法名 4. 通过this引用本类成员方法 this::本类方法名 5. 引用某个类的构造方法 类名::new day14 JUnit 反射 注解 黑盒测试:不需要写代码, 给输入值, 看程序是否能够输出期望的值比如你下载一个APP, 随便点点点, APP闪退了 获取一个类的字节码对象的3种方式: 1. Class.forName("全类名") 将字节码文件加载进内存,返回Class对象 适用场景: 多用于配置文件,将类名定义在配置文件中. 读取文件, 加载类 2. 类名.class . 通过类名的属性class获取 适用场景: 多用于参数的传递 getConstructor(String.class, int.class) 3. 对象.getClass() getClass()方法在Object类中定义 适用场景: 多用于对象的获取字节码的方式 p.getClass() 反射: Class的方法概述java.lang.Class<T>类: 表示一个类的字节码对象, 其中包含该类中定义的内容// 成员方法// 1. 获取成员变量们 Field[] getFields(): 获取所有 public 的成员变量 Field getField(String name): 获取指定名称的 public 的成员变量 Field[] getDeclaredFields(): 获取所有的成员变量, 不考虑权限修饰符 Field getDeclaredField(String name): 获取指定名称的成员变量, 不考虑权限修饰符// 2. 获取构造方法们 Constructor<?>[] getConstructors(): 获取所有 public 的构造方法 Constructor<T> getConstructor(Class<?>... parameterTypes): 获取指定的 public 构造方法 Constructor<?>[] getDeclaredConstructors(): 获取所有的构造方法, 不考虑权限修饰符 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 获取指定的构造方法, 不考虑权限修饰符// 3. 获取成员方法们: Method[] getMethods(): 获取所有 public 的成员方法 Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的 public 成员方法 Method[] getDeclaredMethods(): 获取所有的成员方法, 不考虑权限修饰符 Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取指定的成员方法, 不考虑权限修饰符// 4. 获取Class对象代表的类的全类名 String getName(): 获取当前Class对象代表的类的全类名// 5. 创建对象 T newInstance(): 使用当前类的空参构造, 创建一个对象
今日API获取一个类的字节码对象的3种方式: 1. Class.forName("全类名") 2. 类名.class . 3. 对象.getClass() java.lang.Class<T>类: 表示一个类的字节码对象, 其中包含该类中定义的内容// 获取功能// 1. 获取成员变量们 Field[] getFields(): 获取所有 public 的成员变量 Field getField(String name): 获取指定名称的 public 的成员变量 Field[] getDeclaredFields(): 获取所有的成员变量, 不考虑权限修饰符 Field getDeclaredField(String name): 获取指定名称的成员变量, 不考虑权限修饰符// 2. 获取构造方法们 Constructor<?>[] getConstructors(): 获取所有 public 的构造方法 Constructor<T> getConstructor(Class<?>... parameterTypes): 获取指定的 public 构造方法 Constructor<?>[] getDeclaredConstructors(): 获取所有的构造方法, 不考虑权限修饰符 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes): 获取指定的构造方法, 不考虑权限修饰符// 3. 获取成员方法们: Method[] getMethods(): 获取所有 public 的成员方法 Method getMethod(String name, Class<?>... parameterTypes) : 获取指定的 public 成员方法 Method[] getDeclaredMethods(): 获取所有的成员方法, 不考虑权限修饰符 Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取指定的成员方法, 不考虑权限修饰符// 4. 获取Class对象代表的类的全类名 String getName(): 获取当前Class对象代表的类的全类名// 其他 T newInstance(): 使用当前类的空参构造创建一个对象 A getAnnotation(Class<A> annotationClass): 获取当前类的注解对象 ClassLoader getClassLoader(): 返回该类的类加载器 java.lang.reflect.Field: 表示一个成员变量 // 成员方法 void set(Object obj, Object value): 设置指定对象的成员变量的值 Object get(Object obj): 获取指定对象的成员变量的值 void setAccessible(boolean flag): 传true时忽略访问权限修饰符的安全检查. 暴力反射 java.lang.reflect.Constructor<T>: 表示一个构造方法 // 成员方法 T newInstance(Object... initargs): 使用当前构造方法传入参数, 创建对象 void setAccessible(boolean flag): 注意: 构造方法不能利用此方法忽略权限, 会抛异常 java.lang.reflect.Method类: 表示一个成员方法 // 成员方法 Object invoke(Object obj, Object... args): 使用指定对象和指定参数值调用此方法 String getName(): 获取方法名 void setAccessible(boolean flag): 传true时忽略访问权限修饰符的安全检查. 暴力反射 java.lang.ClassLoader: 类加载器 // 成员方法 InputStream getResourceAsStream(String name): 读取相对于bin目录中的文件, 返回一个字节流 常用元注解: @Target: 描述注解能够作用的位置 ElementType枚举的常用取值: TYPE:可以作用于类上 METHOD:可以作用于方法上 FIELD:可以作用于成员变量上 示例: @Target(value = {ElementType.TYPE, ElementType.METHOD}) @Retention: 描述注解被保留的阶段 RetentionPolicy枚举的取值: SOURCE: 保留到源代码阶段 CLASS: 保留到类对象阶段 RUNTIME: 保留到运行时阶段 示例: @Retention(RetentionPolicy.RUNTIME):保留注解到class字节码文件中并被JVM读取到 @Documented: 加上后, 当前注解会被抽取到api文档中 @Inherited: 加上后, 当前注解会被子类继承
|