Java基础知识(13)(包括网络编程,反射,动态代理)

Java基础知识(13)

(包括网络编程,反射,.动态代理)

目录

Java基础知识(13)

一.网络编程

1. 网络编程基础

(1)什么是网络编程

(2)应用场景:

(3)Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。

(4)常见的软件架构

(5)BS架构的优缺点

(6)CS架构的优缺点

2. 网络编程三要素

(1)简介

(2)IP

1) IPV4

2) IPv6

3)小结

4)IPv4的地址分类形式

5)InetAddress

(3)端口号

(4)协议

1)计算机网络中,连接和通信的规则被称为网络通信协议

2)TCP/IP参考模型

3)UDP协议

4)TCP协议

(5)UDP通信程序

1)发送数据

①步骤

②案例

2)接收数据

①步骤

②案例

(6) UDP的三种通信方式(代码实现)

1)单播:以前的代码就是单播(1对1发送)

2)组播

3)广播

(7)TCP通信程序

1)TCP通信协议简介

2)客户端

①创建客户端的Socket对象(Socket)与指定服务端连接

②获取输出流,写数据

③释放资源

④案例

3)服务器

①创建服务器端的Socket对象(Serversocket)

②监听客户端连接,返回一个Socket对象

③获取输入流,读数据,并把数据显示在控制台

④释放资源

⑤案例

4)TCP通信程序(三次握手)(确保连接建立)

5)TCP通信程序(四次挥手)(确保连接断开,且数据处理完毕)

二. 反射

1.基础知识

(1)反射:反射允许对成员变量,成员方法和构造方法的信息进行编程访问

(2)多种类

2. 获取class对象的三种方式

(1)分类

(2)案例

3. 利用反射获取构造方法

(1)Class类中用于获取构造方法的方法

(2)Constructor类中用于创建对象的方法

4. 利用反射获取成员变量

(1)Class类中用于获取成员变量的方法

(2)Field类中用于创建对象的方法

5. 利用反射获取成员方法

(1)Class类中用于获取成员方法的方法

(2)Method类中用于创建对象的方法

6. 反射的作用

三.动态代理

1.基础知识

(1)为什么需要代理?

(2)代理长什么样?

(3)Java通过什么来保证代理的样子?

2. 如何为Java对象创建一个代理对象

(1)方法

(2)案例

1)主体

2)创建代理


一.网络编程

1. 网络编程基础

(1)什么是网络编程

在网络通信协议下,不同计算机上运行的程序,进行的数据传输

(2)应用场景:

即时通信、网游对战、金融证券、国际贸易、邮件、等等

不管是什么场景,都是计算机跟计算机之间通过网络进行数据传输。

(3)Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。
(4)常见的软件架构

1)C/S: Client/Server客户端/服务器(需要安装)

2)B/S: Browser/Server浏览器/服务器(不需要安装)

(5)BS架构的优缺点

1)不需要开发客户端,只需要页面+服务端

2)用户不需要下载,打开浏览器就能使用

3)但如果应用过大,用户体验受到影响

(6)CS架构的优缺点

1)画面可以做的非常精美,用户体验好

2)需要开发客户端,也需要开发服务端

3)用户需要下载和更新的时候太麻烦

2. 网络编程三要素

(1)简介

IP:设备在网络中的地址,是唯一的标识,

端口号:应用程序在设备中唯一的标识

协议:数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。

(2)IP

全称:Internet Protocol,是互联网协议地址,也称IP地址,是分配给上网设备的数字标签。

通俗理解:上网设备在网络中的地址,是唯一的

常见的IP分类为:IPv4、IPv6

1) IPV4

全称:Internet Protocolversion4,互联网通信协议第四版。

采用32位地址长度,分成4组

2) IPv6

全称:InternetProtocolversion6,互联网通信协议第六版。

由于互联网的蓬勃发展,IP地址的需求量愈来愈大,而IPv4的模式下IP的总数是有限的。

采用128位地址长度,分成8组。

3)小结

①IP的作用

设备在网络中的地址,是唯一的标识

②IPv4有什么特点

目前的主流方案

最多只有2^32次方个ip,目前已经用完了

③IPv6有什么特点

为了解决IPv4不够用而出现的

最多有2^128次方个ip

可以为地球上的每一粒沙子都设定ip

4)IPv4的地址分类形式

①公网地址(万维网使用)和私有地址(局域网使用)。

②192.168.开头的就是私有址址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用,以此节省IP

③特殊IP地址

127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也称本机IP,永远只会寻找当前所在本机。

5)InetAddress

static InetAddress getByName(string host):确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址

String getHostName() 获取此IP地址的主机名

String getHostAddress() 返回文本显示中的IP地址字符串

//1.获取InetAddress的对象

//IP的对象 一台电脑的对象

InetAddress address = InetAddress.getByName("z");

System.out.println(address); //192.168.1.108

String name = address.getHostName();

System.out.println(name)://z

String ip = address.getHostAddress();

System.out.println(ip)://192.168.1.108

(3)端口号

1)应用程序在设备中唯一的标识。

2)端口号:由两个字节表示的整数,取值范围:0~65535,其中0~1023之间的端口号用于一些知名的网络服务或者应用。我们自己使用1024以上的端口号就可以了。

3)注意:一个端口号只能被一个应用程序使用,

(4)协议
1)计算机网络中,连接和通信的规则被称为网络通信协议

①OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推厂

②TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

2)TCP/IP参考模型

应用层 HTTP、FTP、Telnet、 DNs...

传输层 TCP、 UDP.

网络层 TCP、 UDP.

物理链路层 硬件设备010101010101

3)UDP协议

①用户数据报协议(User Datagram Protocol)

②UDP是面向无连接通信协议。速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据

4)TCP协议

①传输控制协议TCP(Transmission Control Protocol)

②TCP协议是面向连接的通信协议。速度慢,没有大小限制,数据安全

(5)UDP通信程序
1)发送数据
①步骤

创建发送端的DatagramSocket对象

数据打包(DatagramPacket)

发送数据

释放资源

②案例

//1.创建Datagramsocket对象(快递公司)

/细节:

//绑定端口,以后我们就是通过这个端口往外发送

//空参:所有可用的端口中随机一个进行使用

//有参:指定端口号进行绑定

DatagramSocket ds=new DatagramSocket();

//2.打包数据

String str="你好!!!"

bytell bytes = str.getBytes();

InetAddress address = InetAddress.getByName("127.0.0.1");

int port = 10086;

DatagramPacket dp = new DatagramPacket (bytes, bytes.length, address, port),

//3.发送数据

ds.send(dp);

//4.释放资源

ds.close();

2)接收数据
①步骤

创建接收端的Datagramsocket对象

接收打包好的数据

解析数据包

释放资源

②案例

//1.创建Datagramsocket对象(快递公司)

//细节:

//在接收的时候,一定要绑定端口

//而且绑定的端口一定要跟发送的口保持一致

DatagramSocket ds=new DatagramSocket( port: 10086);

//2.接收数据包

bytel] bytes = new byte[1024];

DatagramPacket dp= new DatagramPacket(bytes,bytes.length),

//该方法是阻寒的(receive)

//程序执行到这一步的时候,会在这里死等

//等发送端发送消息

ds .receive(dp);

//3.解析数据包

bytel] data = dp.getData();

int len = dp.getLength();

InetAddress address = dp.getAddress();

int port = dp.getPort();

System.out.println("按收数据"+ new string(data,offset: 0,len));

System.out.print1n("该数据是从"+ address +"这台电脑中的"+ port +"这个端口发出的");

//4.释放资源

ds.close();

(6) UDP的三种通信方式(代码实现)
1)单播:以前的代码就是单播(1对1发送)
2)组播

组播地址:224.0.0.0~239.255.255.255

其中224.0.0.0~224.0.0.255为预留的组播地址

接收代码跟以前几乎一样,只是要指定组播地址

InetAddress address = InetAddress.getByName("224.0.0.1“);

接收代码多了一步

//2.将将当前本机,添加到224.0.0.1的这一组当中

InetAddress address = InetAddress.getByName("224.0.0.1");

ms.joinGroup(address);

3)广播

广播地址:255.255.255.255

接收代码跟以前几乎一样,只是要指定组播地址

InetAddress address = InetAddress.getByName("255.255.255.255“);

发送代码跟以前一样

(7)TCP通信程序
1)TCP通信协议简介

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象

通信之前要保证连接已经建立

通过Socket产生I0流来进行网络通信

2)客户端
①创建客户端的Socket对象(Socket)与指定服务端连接

Socket(string host, int port)

②获取输出流,写数据

Outputstream getoutputstream()

③释放资源

void close()

④案例

//TCP协议,发送数据

//1.创建socket对象

//细节:在创建对象的同时会连接服务端,如果连接不上,代码会报错

Socket socket = new Socket( host:"127.0.0.1",port: 10000);

//2.可以从连接通道中获取输出流

Outputstream os=socket.getoutputstream();

//写出数据

os.write("你好你好".getBytes());(不能传中文)

//3.释放资源

os.close();

socket.close();

3)服务器
①创建服务器端的Socket对象(Serversocket)

Serversocket(int port)

②监听客户端连接,返回一个Socket对象

Socket accept()

③获取输入流,读数据,并把数据显示在控制台

Inputstream getInputstream()

④释放资源

void close()

⑤案例

//TCP协议,接收数据

//1.创建对象serversocker

ServerSocketss =new serverSocket( port:10080);

//2.监听客户端的链接

Socket socket= ss.accept();

//3.从连接通道中获取输入流读取数据

Inputstream is = socket.getInputStream();

InputstreamReader isr =new InputstreamReader(is);

int b;

while((b=isr.read())!=-1){

System.out.print((char)b);

//4.释放资源

socket.close();

ss.close();

4)TCP通信程序(三次握手)(确保连接建立)

①客户端向服务器发出连接请求,等待服务器确认

②服务器向客户端返回一个响应,告诉客户端收到了请求

③客户端向服务器再次发出确认信息,连接建立

5)TCP通信程序(四次挥手)(确保连接断开,且数据处理完毕)

①客户端向服务器发出取消连接请求

②服务器向客户端返回一个响应,表示收到客户端取消请求(服务器将最后的数据,处理完毕)

③服务器向客户端发出确认取消信息

④客户端再次发送确认消息,连接取消

二. 反射

1.基础知识

(1)反射:反射允许对成员变量,成员方法和构造方法的信息进行编程访问
(2)多种类

获取class对象 Class

构造方法 Constructor

字段(成员变量) Field

成员方法 Method

2. 获取class对象的三种方式

(1)分类

Class.forName("全类名");

类名.class

对象.getclass();

(2)案例

//1.第一种方式

//全类名: 包名 +名

//最为常用的

Class clazz1 =class,forName("com,itheima.myreflect1.student");

//2.第二种方式

//一般更多的是当做参数进行传递

Class clazz2 = Student,class;

//3.第三种方式

//当我们已经有了这个类的对象时,才可以使用。

student s= new student();

Class clazz3=s.getclass();

3. 利用反射获取构造方法

(1)Class类中用于获取构造方法的方法

①Constructor<?>[]getConstructors():返回所有公共构造方法对象的数组

②Constructor<?>[]getDeclaredConstructors():返回所有构造方法对象的数组(包括私有)

③Constructor<T>getConstructor(Class<?>... parameterTypes):返回单个公共构造方法对象

④Constructor<T>getDeclaredConstructor(Class<?>.. parameterTypes):返回单个构造方法对象(包括私有)

⑤案例

Class clazz= Class.forName("com.itheima.myreflect2.student");

Constructor[]cons1=clazz.getconstructors();

for(constructor con:cons1){

System.out.println(con);

Constructor con2=clazz.getDeclaredconstructor(string.class);

(2)Constructor类中用于创建对象的方法

①T newInstance(Object...initargs):根据指定的构造方法创建对象

②setAccessible(boolean flag):设置为true,表示取消访问检查

③案例

//暴力反射:表示临时取消权限校验(可以使用私有构造)

con4.setAccessible(true);

Student stu=(student)con4.newInstance("张”,23);

System.out.printin(stu);

4. 利用反射获取成员变量

(1)Class类中用于获取成员变量的方法

①Field[]getFields():返回所有公共成员变量对象的数组

②Field[}getDeclaredFields():返回所有成员变量对象的数组

③Field getField(String name): 返回单个公共成员变量对象

④Field getDeclaredField(String name):返回单个成员变量对象

⑤案例

//获取单个的成员变量

Field name= clazz.getDeclaredField( name:"name");

System.out.println(name);

//获取权限修饰符

int modifiers = name.getModifiers(),

System.out.println(modifiers);

//获取成员变量的名字

String n= name.getName();

System.out.println(n);

//获取成员变量的数据类型

Class<?> type = name.getType();

System.out.printin(type);

//获取成员变量记录的值

Student s= new student( name:"zhangsan",age: 23, gender:"”");

name.setAccessible(true);

String value =(string) name.get(s);

System.out.println(value);

//修改对象里面记录的值

name.set(s,"lisi");

(2)Field类中用于创建对象的方法

①void set(Object obj, Object value):赋值

②Object get(Object obj)获取值。

5. 利用反射获取成员方法

(1)Class类中用于获取成员方法的方法

①Method[lgetMethods():返回所有公共成员方法对象的数组,包括继承的

②Method[]getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的

③Method getMethod(String name, Class<?>.. parameterTypes):返回单个公共成员方法对象

④Method getDeclaredMethod(String name, Class<?>.. parameterTypes):返回单个成员方法对象

⑤案例

(2)Method类中用于创建对象的方法

①Object invoke(Object obj, Object..args):运行方法

参数一:用obi对象调用该方法

参数二:调用方法的传递的参数(如果没有就不写)

返回值:方法的返回值(如果没有就不写)

②一系列get…方法。

③案例

student s= new student();

m.setAccessible(true);

//参数一s:表示方法的调用者

//参数二"汉堡包":表示在调用方法的时候传递的实际参数

Object result =m.invoke(s,"汉堡包");

System.out.printin(result);

6. 反射的作用

①获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑

②结合配置文件,动态的创建对象并调用方法

三.动态代理

1.基础知识

(1)为什么需要代理?

代理可以无侵入式的给对象增强其他的功能

调用者 -> 代理 -> 对象

(2)代理长什么样?

代理里面就是对象要被代理的方法

(3)Java通过什么来保证代理的样子?

通过接口保证,后面的对象和代理需要实现同一个接口

接口中就是被代理的所有方法

2. 如何为Java对象创建一个代理对象

(1)方法

java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:

public static object newProxyInstance(classLoader loader, Class<?>[] interfaces, InvocationHandler h)

参数一:用于指定用哪个类加载器,去加载生成的代理类

参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法

参数三:用来指定生成的代理对象要于什么事情

(2)案例
1)主体

需求:

外面的人想要大明星唱一首歌

①获取代理的对象:代理对象 = ProxyUtil.createProxy(大明星的对象);

②再调用代理的唱歌方法:代理对象.唱歌的方法("只因你太美")

//1.获取代理的对象

Bigstar bigstar = new Bigstar( name:"鸡拼");

star proxy= ProxyUtil.createProxy(bigstar);

//2.调用唱歌的方法

String result = proxy.sing( "只内你太美");

System.out.println(result);

2)创建代理

public static star createProxy(Bigstar bigstar){

Star star=(star)Proxy.newProxyInstance(

Proxyuti1.class.getclassLoader(),//参数一:用于指定用哪个类加载器,去加载生成的代理类

new class[]{star.class},//参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法

//参数三:用来指定生成的代理对象要干什么事情

new InvocationHandler(){

@override

public object invoke(object proxy, Method method, object[] args) throws Throwable {

*参数一:代理的对象

*参数二:要运行的方法 sing

*参数三:调用sing方法时,传递的实参

if("sing".equals(method.getName())){

System.out.println("准备话简,收钱”);

}else if("dance".equals(method.getName())){

System.out.println("准备场地,收钱”);

//去找大明星开始唱歌或者跳舞

//代码的表现形式:调用大明星里面唱歌或者跳舞的方法

return method.invoke(bigstar,args);

}

}

};

Return star;

}

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的进步!!Java学习更是如此,知识点总结目录如下: 目录 一、 Java概述 3 二、 Java语法基础 5 数据类型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 20 四、 面向对象★★★★★ 21 五、 封装(面向对象特征之一)★★★★ 23 六、 继承(面向对象特征之一)★★★★ 25 七、 接口(面向对象特征之一)★★★★ 28 八、 多态(面向对象特征之一)★★★★ 30 九、 java.lang.Object 31 十、 异常★★★★ 34 十一、 包(package) 37 十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五、 API 71 String字符串:★★★☆ 71 StringBuffer字符串缓冲区:★★★☆ 73 StringBuilder字符串缓冲区:★★★☆ 74 基本数据类型对象包装类★★★☆ 75 集合框架:★★★★★,用于存储数据的容器。 76 Collection接口 77 Iterator接口 78 List接口 78 Set接口 80 Map接口 81 把map集合转成set的方法 82 使用集合的技巧 83 Collections--集合工具类 83 Arrays—数组对象工具类 84 增强for循环 85 可变参数(...) 86 枚举:关键字 enum 86 自动拆装箱 86 泛型 87 System 89 Runtime 90 Math 90 .Date:日期类,月份从0—11 92 Calendar:日历类 93 十六、 IO流:用于处理设备上数据 ★★★★★ 94 IO流的概念 95 字符流与字节流 98 流对象 101 File类 102 Java.util.Properties 103 介绍IO包中扩展功能的流对象 103 十七、 网络编程 110 网络基础网络协议篇 111 UDP传输 124 TCP传输 126 十八、 反射技术 127 十九、 Ajax原理及实现步骤★★★★★ 130 Ajax概述 130 Ajax工作原理 130 Ajax实现步骤 130 详解区分请求类型: GET或POST 131 $.ajax标准写法 134 二十、 正则表达式:其实是用来操作字符串的一些规则★★★☆ 135 二十一、 设计模式★★★★★ 136 设计模式简介 136 单例设计模式:★★★★★ 156 工厂模式★★★★★ 159 抽象工厂模式★★★★★ 163 建造者模式 170 原型模式 177 适配器模式 182 桥接模式 188 过滤器模式 192 组合模式 193 装饰器模式★★★★★ 196 外观模式 201 享元模式 204 代理模式★★★★★ 208 责任链模式 212 命令模式 216 解释器模式 219 迭代器模式 222 中介者模式 224 备忘录模式 226 观察者模式 230 状态模式 233 空对象模式 236 策略模式★★★★★ 238 模板模式 240 访问者模式 244 设计模式总结★★★★★ 247 二十二、 Java其他总结 248 Java JVM知识点总结 248 equals()方法和hashCode()方法 270 数据结构 273 Array方法类汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值