A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王x 中级黑马   /  2018-12-2 16:35  /  632 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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
今日API
java.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
今日API
java.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转换
day13
Stream.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
今日API
java.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
  • 引用创建数组的方法           数据类型[]::new

day14 JUnit 反射 注解
  • 黑盒测试:不需要写代码, 给输入值, 看程序是否能够输出期望的值比如你下载一个APP, 随便点点点, APP闪退了
    • 白盒测试:需要写代码的. 关注程序具体的执行流程比如今天学习的JUnit
    • @Before: 修饰的方法会"在每个测试方法执行 之前"被执行@After:  修饰的方法会"在每个测试方法执行 之后"被执行

    获取一个类的字节码对象的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: 加上后, 当前注解会被子类继承


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马