本帖最后由 小石姐姐 于 2018-4-25 15:39 编辑
第12天 面向网络编程 1.网络三要素:
传输协议:作用是通信的规则
UDP协议发送数据:DatagramSocket类
DatagramPacket类:表示数据报包
UDP协议接收数据:DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。
注意事项:端口号错误,数据可以经常发出,不会出现异常,但收不到数据
TCP协议发送数据:java.net.Socket 客户端
TCP协议接收数据:ServerSocket 服务端
Socket accept():侦听并接受到此套接字的连接。(监听)
2. IP地址:(IPv4,IPv6)
InetAddress类:此类表示互联网协议 (IP) 地址。
static InetAddress getByName(String host):在给定主机名的情况下确定主机的 IP 地址。
static InetAddress getLocalHost():返回本地主机
static InetAddress getByAddress(String host, byte[] addr):根据提供的主机名和 IP 地址创建 InetAddress。
String getHostName() :获取此 IP 地址的主机名。
String getHostAddress() :返回 IP 地址字符串(以文本表现形式)。
注意:IP地址是唯一的
第13天 进阶基础
第1章 反射机制概述、字节码对象的获取方式、反射操作构造方法、成员方法、成员属性1. 反射介绍[size=18.6667px] JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法 对于任意一个对象,都能够调用它的任意一个方法 这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制. 简单来说, 就可以把.class文件比做动物的尸体, 而反射技术就是对尸体的一种解剖.通过反射技术, 我们可以拿到该字节码文件中所有的东西, 例如成员变量, 成员方法, 构造方法, 而且还包括私有 2. 字节码文件获取的三种方式1. 对象名.getCalss(); // 次方法来自于Object 对象已经存在的情况下, 可以使用这种方式 2. 类名.class // 类名.class这是一个静态的属性, 只要知道类名, 就可以获取 3. Class.forName(“com.itheima_01.Student”); // 通过Class类中的静态方法, 指定字符串, 该字符串是类的全类名(包名+类名) // 此处将会抛出异常都系 ClassNotFoundException 防止传入错误的类名 3. 字节码对象是用来描述
1. 成员变量
2. 成员方法
3. 构造方法
2 反射操作构造方法 1. 直接通过Class类中的newInstance()和获取getConstructor()的区别newInstance()方法, 只能通过空参的构造方法创建对象 getConstructor(Class<T>… parameterTypes)方法, 方法接受一个可变参数, 可以根据传入的类型来匹配对应的构造方法
3 反射操作公共成员变量1.反射public成员变量(字段) 通过反射运行public变量流程 1. 通过反射获取该类的字节码对象 Class clazz = Class.forName("com.heima.Person"); 2. 创建该类对象 Object p = clazz.newInstance(); 3. 获取该类中需要操作的字段(成员变量) getField(String name) --> 方法传入字段的名称. 注意: 此方法只能获取公共的字段 Field f = clazz.getField("age"); 4. 通过字段对象中的方法修改属性值 void set(Object obj, Object value) --> 参数1): 要修改那个对象中的字段, 参数2): 将字段修改为什么值. f.set(p, 23); 2 .方法总结 通过反射获取成员变量并使用
Field[] getFields() --> 返回该类所有(公共)的字段
Field getField(String name) --> 返回指定名称字段
Field[] getDeclaredFields() --> 暴力反射获取所有字段(包括私有)
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
4 反射操作私有成员变量1. 反射private成员变量(字段) 反射private属性执行流程 1. 获取学生类字节码对象
2. 获取学生对象
3. 通过getDeclaredField方法获取私有字段
4. 通过setAccessible让jvm不检查权限
5. 通过set方法设置对象为具体的值 2. 方法总结 Field[] getDeclaredFields() --> 暴力反射获取所有字段(包括私有)
Field getDeclaredField(String name) --> 暴力反射获取指定名称字段
void setAccessible(boolean flag) --> 让jvm不检查权限
5 通过反射获取成员方法并使用1.反射获取普通成员方法 反射public方法执行流程 1. 获取学生类字节码对象
2. 反射手段创建学生对象
3. 调用getMethod方法获取Method对象, 方法形参接受方法的名字
4. 调用Method方法中的invoke()将方法运行 2 .方法总结Class:
Method getMethod(String name, Class<?>... parameterTypes)
// 此方法由字节码对象调用
// 参数1: 要反射的方法名称
// 参数2: 此方法需要接受的参数类型(注意,传入的都是字节码)
Method:
Object invoke(Object obj, Object... args)
// 方法由Method对象调用
// 参数1: 要由那个对象调用方法
// 参数2: 方法需要的具体实参(实际参数) 3 .私有的成员方法 // 获取字节码对象 Class clazz = Class.forName("com.heima.Student"); // 创建学生对象 Object stu = clazz.newInstance(); // 暴力反射获取方法 Method method = clazz.getDeclaredMethod("method"); // 让jvm不检查权限 method.setAccessible(true); // 执行方法 method.invoke(stu); 第2章 JavaBean的概述、BeanUtils的使用JavaBean的概述: 将需要操作的多个属性封装成JavaBean, 简单来说就是用于封装数据的 规范: 类使用公共进行修饰 提供私有修饰的成员变量 为成员变量提供公共getter和setter方法 提供公共无参的构造 1. BeanUtils的概述 BeanUtils的由来 之前我们使用的类都是来自Java编写好的源代码而这个BeanUtils却是一个叫做Apache的组织编写. 那么这个组织编写的代码当中, 有一个系列可以很方便的提高我们今后的开发效率. 这个系列为Commons, BeanUtils就是其中之一 2. 准备工作 1. 导入两个jar包 commons-beanutils-1.8.3.jar commons-logging-1.1.1.jar 2. 将jar包Build path 配置到当前的classpath环境变量中 3 .BeanUtils的常用方法static void setProperty(Object bean, String name, Object value)
static String getProperty(Object bean, String name)
static void populate(Object bean, Map properties)
setProperty 用来给对象中的属性赋值(了解) 参数1: 需要设置属性的对象 参数2: 需要修改的属性名称 参数3: 需要修改的具体元素 getProperty 用来获取对象中的属性(了解) 参数1: 要获取的javaBean对象 参数2: 对象中的哪个属性 Populate 用来给对象中的属性赋值(掌握) 参数1: 要设置属性的对象 参数2: 将属性以Map集合的形式传入 Key : 属性的名称 Value: 属性具体的值 4. 方法总结三个方法底层是通过反射实现, 而且反射操作的是setXxx方法和getXxx方法. 所以编写JavaBean的时候一定要注意格式 1. 功能分析定义MyBeanUtils工具类, 实现与BeanUtils相同的功能 public static void setProperty(Object bean,String name,Object value) // 设置任意对象的, 任意属性, 为任意的值 public static String getProperty(Object bean,String name) // 获取任意对象的任意属性 public static void populate(Object bean,Map map) // 修改任意对象中的属性, 为传入Map集合中的键和值 2. 功能分析public static void populate(Object bean,Map map) // 修改任意对象中的属性, 为传入Map集合中的键和值 思路: a) 获取传入对象的字节码对象 b) 获取map集合中所有的键和值 c) 调用Class中的getDeclaredField()方法将每一个键传入, 得到Field对象 d) 通过Field对象中的set方法赋值 e) Try catch捕获getDeclaredField方法可能发生的异常.(为了方式传入错误的值)
|