网络编程、反射
网络编程 C/S
直接或间接地通过网络协议与其它计算机进行通讯,实现数据交换,资源共享
-
ip地址 cmd ipconfig
-
port端口号 0--65535,0--1023被服务器占用
-
Socket套接字
-
start()方法,真正实现了多线程运行,run()方法只是一个普通方法,称为线程体,start方法会自动调用run方法,run必须是public,返回值void。
127.0.0.1是回送地址,指本地机
TCP提供面向连接的、可靠的、基于字节流的传输层通信协议。三次握手四次挥手,一般用于文件传输、发送和接收邮件、远程登录等场景。
UDP是一个无连接的协议,在传送数据之前不需要先建立连接,交付不可靠,一般用于即时通信,比如QQ。
TCP三次握手,四次挥手:
- 传输前,采用"三次握手"方式,是可靠的
- 第1次 客户端---->服务器端---->客户端
第2次 客户端接收到服务器端返回的消息
第3次 客户端---->服务器端
- 传输完毕,需释放已建立的连接,“四次挥手”,效率低
- 第1次 客户端---->服务器端说我要关闭连接了
第2次 服务器端说可以,但是你等我一会,我把剩余的任务做完
第3次 服务器端做完收尾工作之后---->客户端说,我这边结束了,你可以关了
第4次 客户端说OK,我关了
Socket套接字
通信两端都要有Scoket,服务器端ServerSocket
网络通讯其实就是Socket之间的通信,
Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输
基于Socket编程实现cs(Client-Server)
//服务器端
1.创建服务器端套接字,ServerSocket,端口号
2.accept 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
3.getInputStream //输入流
4.FileOutputStream //获取客户端发过来的数据
5.buff缓冲器
6.while:read读,getOutupStream //响应消息给客户端
7.close关闭
//客户端
1.创建客户端套接字Socket,IP地址+端口号
2.getOutputStream //输出流
3.FileInputStream //读取本地文件
3.buff缓冲器
4.while:write写
shutdownOutput //数据发送完毕
getInputStream //接收服务器端响应的数据
5.close关闭
UDP
DatagramPacket对象封装了UDP数据报
通过数据报套接字DatagramSocket发送和接收UDP数据报
URL编程
URL url = new URL;
URL的基本结构由5部分组成
<传输协议>://<主机名>:<端口号>/<文件名>
反射reflection
Java的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法,并且对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制。
反射就是把java类中的各种成分映射成一个个的Java对象
-
反射中,可把方法视为对象
-
用方法对象 来调用 方法
-
运行时期,动态创建对象
反射有什么用
1,在运行时判断任意一个对象所属的类;
2,在运行时构造任意一个类的对象;
3,在运行时判断任意一个类所具有的成员变量和方法;
4,在运行时调用任意一个对象的方法;
5,生成动态代理。
通过配置文件,在不改变源码的情况下,来控制程序,符合ocp开闭原则
反射中常见的API:
Class类
是描述类的类,可以获取一个类的描述,类中属性,方法,构造器的信息等
-
没有构造方法,只能由系统创建
-
一个class对象对应的是一个加载到jvm中的一个.class文件
获取class类对象的方法****:
- Class.forName()静态方法,多用于配置文件
Class<?> aClass = Class.forName("com.qf.javase.day22.Exe1.User");
- 类的.class方法,多用于参数传递
Class<User> aClass2 = User.class;
- 使用实例对象的getClass方法
User user = new User();
Class<? extends User> aClass3 = user.getClass();
- ClassLoader类加载器
Class<? extends ClassLoader> aClass4 = User.class.getClassLoader().getClass();
method描述方法的类
getMethods获取所有public修饰的方法(包含父类)
getDeclaredMethods获取当前类所有的权限修饰符修饰的方法(不包括父类)
field描述属性的类(成员变量)
getFields返回所有的public修饰的属性,包含父类
getDeclaredFields返回当前类的所有权限的属性(不包括父类)
setAccessible(true)给私有属性赋值需要****开启权限
constructor描述构造方法的类
newInstance调用无参构造方法
getConstructor调用有参构造方法
getModifiers获取构造方法的权限修饰符
ClassLoader类加载器
getClassLoader
getResourceAsStream获取一个文件的输入流
代理模式Proxy Pattern
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,代理对象在客户端和目标对象之间起到中介作用,属于结构型设计模式。
调用目标对象,增强目标对象的功能。
静态代理
接口,优先于实现类
局限:每一个代理类只能代理一个接口
动态代理DynamicProxy
- JDK动态代理
JDK自带的动态代理类java.lang.reflect.Proxy实现动态代理
优点: 简单、方便
缺点: 只能代理接口,不能代理类
- CGLib动态代理
如果目标对象没有实现任何接口,那么只能使用CGLib动态代理
开源,功能强大高性能的代码生成库
优点: 可以代理类
函数式接口@FunctionalInterface
-
首先它是一个接口,然后在这个接口里面有且只有一个抽象方法。
-
允许定义静态方法
-
允许定义默认方法