木舟0基础学习Java的第二十一天(网络编程,反射)

网络编程

三要素:1.IP地址 2.端口 3.协议

 InetAddress互联网协议 (IP) 地址

 封装了IP地址的类

用法:
public static void main(String[] args){//获取IP地址try {InetAddress ia=InetAddress.getByName("www.baidu.com");System.out.println(ia);//www.baidu.com/110.242.68.3//返回本地域名System.out.println(ia.getHostName());//www.baidu.com//返回IP地址System.out.println(ia.getHostAddress());//110.242.68.3System.out.println(ia.getCanonicalHostName());//110.242.68.4//获取本机地址InetAddress localHost = ia.getLocalHost();System.out.println(localHost);} catch (UnknownHostException e) {throw new RuntimeException(e);}}

URL路径

用法:
 public static void main(String[] args) {//URL路径try {URL url=new URL("https://www.baidu.com:80/index.html#muzhou");System.out.println("协议:"+url.getProtocol());//协议:httpsSystem.out.println("域名:"+url.getHost());//域名:www.baidu.comSystem.out.println("端口:"+url.getPort());//端口:80System.out.println("资源:"+url.getFile());//资源:/index.htmlSystem.out.println("锚点:"+url.getRef());//锚点:muzhouSystem.out.println("相对路径:"+url.getPath());//相对路径:/index.htmlSystem.out.println("参数:"+url.getQuery());//null} catch (MalformedURLException e) {throw new RuntimeException(e);}}

常用端口:

3306 mysql

1521 oracle

80 web

8080 tomcat

4000 QQ

2425 飞秋feiQ

协议:

UDP协议:

用户数据 面向连接 数据安全 速度快 区分客户端和服务端

(例子:相当于发短信 不论对方是否在线 是否能接收到)

Socket通信(套接字):

网络上具有唯一标识的IP地址和端口号组合在一起  才能构成唯一能识别的标识符套接字

通信的两端都有Socket

网络通信其实就是Socket间的通信

数据在Socket中通过IO流传输

案例:UDP传输多线程
//(服务端)接收
public class Reciver extends Thread {public void run(){//建立码头DatagramSocket s=null;try {//指定端口号9999s=new DatagramSocket(9999);//货轮byte[] b=new byte[1024];//集装箱接受数据DatagramPacket p=new DatagramPacket(b,1024);while(true){//将数据装载到集装箱中s.receive(p);//获取数据来源的地址InetAddress ip=p.getAddress();String msg=new String(b);System.out.println("从"+ip+"发送过来"+msg);}} catch (Exception e) {throw new RuntimeException(e);}finally{s.close();}}}
//(客户端)发送
public class Sender extends Thread {public void run(){//创建码头DatagramSocket s=null;while(true){try {s=new DatagramSocket();//准备备货物Scanner sc=new Scanner(System.in);System.out.println("请客户端输入:");String msg=sc.next();//创建货轮byte[] b=msg.getBytes();//获取客户地址InetAddress ip=InetAddress.getByName("127.0.0.1");//将货物装入集装箱DatagramPacket p=new DatagramPacket(b,0,b.length,ip,9999);//发送s.send(p);} catch (Exception e) {throw new RuntimeException(e);}finally{s.close();}}}
}

 //测试public static void main(String[] args) {Reciver r=new Reciver();r.start();Sender s=new Sender();s.start();}

(重点)TCP协议:

传输控制 面向连接(三次握手) 数据安全 速度略慢 分为客户端和服务段

(例子1:打电话 呼叫 接听 数据传输)(例子2:网站访问:客户端发送请求 连接服务器 数据传输)

案例:TCP传输多线程

public class Sender extends Thread{public void run(){ServerSocket ss=null;BufferedReader br=null;try {//创建服务端的套接字ss=new ServerSocket(8888);//阻塞Socket socket=ss.accept();//读取客户端的流InputStream in=socket.getInputStream();br=new BufferedReader(new InputStreamReader(in));while(true){String msg=br.readLine();System.out.println("客户端发来:"+msg);}} catch (Exception e) {throw new RuntimeException(e);}finally{if(br!=null){try {br.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
public class Client extends Thread {OutputStream out=null;BufferedWriter bw=null;public void run(){try {//定位Socket s=new Socket("127.0.0.1",8888);//发送out=s.getOutputStream();bw=new BufferedWriter(new OutputStreamWriter(out));Scanner sc=new Scanner(System.in);while(true){System.out.println("请客户端输入:");String str=sc.next();bw.write(str);bw.newLine();bw.flush();}} catch (IOException e) {throw new RuntimeException(e);}finally{if(bw!=null){try {bw.close();} catch (IOException e) {throw new RuntimeException(e);}}}}
}
public class Test_Client {public static void main(String[] args) {Client c=new Client();c.start();}
}
public class Test_Sender {public static void main(String[] args) {Sender s=new Sender();s.start();}
}

反射 (解剖 类)

对于任意一个类 都能知道这个类中的所有属性和方法

对于任意一个对象 都能够调用它任意的方法和属性

动态获取的信息以及动态调用对象的方法 称为java的反射机制

类的加载:

类的加载概述:当程序要使用某个类时,如果该类没有加载到内存中 系统将通过加载,连接,初始化三步实现对这个类进行初始化 

加载:将class文件读入内存 并为之创建一个class对象 任何类被使用时系统都会创建一个class对象

连接:

验证:是否有正确的内部结构 并和其他类协调一致 

准备:负责为类的静态成员分配内存 并赋值 默认值

解析:将类的二进制数据中的符号引用替换为直接引用

初始化

平时使用的

类加载器(classLoader):负责将.class文件加载到内存中 并为之生成对应的class对象

类加载器分为:根类加载器 扩展类加载器 系统类加载器

字节码加载时机:

创建类的实例(new)

访问类的静态变量或者为静态变量赋值

调用类的静态方法 使用反射方式强制创建某个类或接口对应的class对象

初始化某个类的子类 直接使用java.exe命令运行某个主类

获取字节码文件

三种方式获取字节码文件

  //三种方式获取字节码文件//第一种Class c1=Class.forName("com.muzhou.lesson.Person");//第二种Class c2=Person.class;//第三种Person p=new Person();Class c3=p.getClass();//验证三种方法取出的字节码文件是否相同System.out.println(c1==c2);//trueSystem.out.println(c2==c3);//true

反射创建无参构造和有参构造

第一种

 //获取反射无参构造和有参构造创建public static void main(String[] args) throws Exception {//Class类的.newInstance()是使用该类的无参构造方法创建对象//如果一个类没有无参构造 就不能这么创建 会报错 InstantiationExceptionClass clazz=Class.forName("com.muzhou.lesson.clazz.Person");//通过无参构造创建对象/* Person p =(Person) clazz.newInstance();System.out.println(p);//Person{name='null', age=0}*///获取有参构造  没有无参构造创建对象//clazz.getConstructor(String.class,int.class);//String.class,int.class要与Person类中的属性对应Constructor c = clazz.getConstructor(String.class, int.class);//通过有参构造创建对象Person p=(Person)c.newInstance("张三",23);System.out.println(p);//Person{name='张三', age=23}

第二种

 //反射其实就是在分解class对象Class<Person> clazz=Person.class;//这个过期了 Person p1 =clazz.newInstance();//现在使用.getDeclaredConstructor().newInstance();创建一个无参构造器对象 再用对象创建实例Person p1 = clazz.getDeclaredConstructor().newInstance();p1.setName("张三");p1.setAge(23);System.out.println(p1);Constructor<Person> c = clazz.getDeclaredConstructor(String.class, int.class);Person p2 =c.newInstance("李四", 24);p2.eat();p2.eat(10);System.out.println(p2);

反射获取成员变量(如果是私有的就用暴力反射)

   Class clazz=Class.forName("com.muzhou.lesson.clazz.Person");Constructor c = clazz.getConstructor(String.class, int.class);Person p =(Person)c.newInstance("张三", 23);//clazz.getFields("name");可以获取到类中指定的字段(必须是可见的public)/*  Field f = clazz.getFields("name");f.set(p,"李四");*///暴力反射Field f = clazz.getDeclaredField("name");//在这一步去除私有权限 变成publicf.setAccessible(true);f.set(p,"李四");System.out.println(p);

反射获取方法

 //反射获取方法Class clazz=Class.forName("com.muzhou.lesson.clazz.Person");Constructor c = clazz.getConstructor(String.class, int.class);Person p =(Person) c.newInstance("张三", 23);//通过clazz获取Method 返回的是Method 获取eat方法Method m1 = clazz.getMethod("eat");//eat不用加()m1.invoke(p);//获取带参数的方法Method m2 = clazz.getMethod("eat", int.class);m2.invoke(p,10);

反射获取所有属性

Class<Person> clazz=Person.class;//获取所有成员变量Field[] fields =clazz.getDeclaredFields();System.out.println(fields.length);//2for (Field f : fields) {System.out.println(f.getName()+"----"+f.getAnnotatedType());}//获取所有构造Constructor<?>[] c = clazz.getDeclaredConstructors();for (Constructor cs : c) {System.out.println(cs);}//获取所有方法Method[] m = clazz.getDeclaredMethods();for (Method method : m) {System.out.println( method.getName()+"返回类型"+method.getGenericReturnType()+"方法中形式参数"+method.getGenericParameterTypes());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git跨库合并

1、背景 A为开发环境的代码仓库&#xff0c;B为生产环境的代码仓库。A和B之间不能通信。开发人员的本地电脑可以和A、B通信。 目的 上线时&#xff0c;需要将A代码合并B代码。 2、实现 2.1 添加远程仓库 2.1.1 代码方式 在B代码仓库中,将A添加为远程仓库。 git remote …

【保姆级教程】油猴脚本的安装使用

目录 前言 一、油猴简介 1. 核心功能 2. 应用场景 3. 安全性与兼容性 4. 社区生态 二、教学开始&#xff08;嫌麻烦直接目录跳转开始学习&#xff09; 1.插件安装&#xff08;以Microsoft Edge浏览器为例&#xff09; 2.获取脚本 3.大展身手 三、扩展&#xff08;脚…

2024年7月23日(samba DNS)

​ 回顾 1、关闭防火墙&#xff0c;关闭selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 2、修改静态IP地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #修改uuid的目的是为了保证网络的唯一性 3、重启网络服务 systemctl restart netwo…

Ansible的脚本-----playbook剧本【上】

目录 1.playbook剧本组成 2.playbook剧本实战演练 2.1 实战演练一&#xff1a;给被管理主机安装httpd服务 2.2 实战演练二&#xff1a;定义、引用变量 2.3 实战演练三&#xff1a;指定远程主机sudo切换用户 2.4 实战演练四&#xff1a;when条件判断 2.5 实战演练五&…

【Matlab 传感器布局优化】基于群智能算法的wsn覆盖优化研究

一 背景介绍 无线传感器网络&#xff08;Wireless Sensor Network, WSN&#xff09;作为远程环境监测系统应用的关键技术&#xff0c;能够在有限的能源供应下提供高效的传感和通信服务。覆盖控制是保证高效通信和可靠数据传输的重要手段。鉴于复杂的物理环境限制了节点部署方式…

昇思MindSpore 应用学习-基于MobileNetv2的垃圾分类

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#xff09;&…

文本编辑三巨头(grep)

目录 正则表达式 元字符 grep 案例 我在编写脚本的时候发现&#xff0c;三个文本编辑的命令&#xff08;grep、sed、awk&#xff0c;被称为文本编辑三剑客&#xff0c;我习惯叫它三巨头&#xff09;用的还挺多的&#xff0c;说实话我一开始学的时候也有些懵&#xff0c;主要…

Unity3D之TCP网络通信(客户端)

文章目录 概述TCP核心类异步机制 Unity中创建TCP客户端Unity中其它脚本获取TCP客户端接受到的数据后续改进 本文将以Unity3D应用项目作为客户端去连接制定的服务器为例进行相关说明。 Unity官网参考资料&#xff1a; https://developer.unity.cn/projects/6572ea1bedbc2a001ef…

AWS 国内 配置docker环境并安装相关应用

无论系统中是否有Docker&#xff0c;我们需要先卸载老版本&#xff0c;我们需要安装新版本CE&#xff0c;其实我们应该知道Docker有分CE社区版本和EE企业版&#xff0c;后者是需要付费的&#xff0c;我们安装CE免费版本。 yum remove docker docker-client docker-client-late…

mysql 如何修改JSON字段中的一部分参数值

在 MySQL 中修改 JSON 对象中的一部分值可以使用一些内置的 JSON 函数来实现。假设你有一个包含 JSON 数据的列&#xff0c;你可以使用 JSON_SET() 函数来更新其中的某个字段。 假设你有一个表 my_table&#xff0c;其中有一个 json_column 列包含 JSON 数据&#xff0c;示例数…

2024年平面设计软件:六大选择

无论是与营销还是产品设计&#xff0c;平面设计都是当今各个行业不可或缺的一部分。然而&#xff0c;随着平面设计软件的范围和复杂性的不断扩展&#xff0c;设计师和业余用户可能更难知道哪些工具最能满足他们的需求。 本文将分析当今流行的分析 6 个平面设计 App&#xff0c…

mac清理软件哪个好用免费 MacBook电脑清理软件推荐 怎么清理mac

随着使用时间的增长&#xff0c;mac电脑会积累一些不必要的垃圾文件&#xff0c;这些文件会占用宝贵的存储空间&#xff0c;影响电脑的运行速度和稳定性。因此&#xff0c;定期清理mac电脑的垃圾文件是非常有必要的。市场上有许多优秀的Mac清理软件&#xff0c;包括一些出色的国…

AI产品经理怎样入门?

AI产品经理需要熟悉AI基础知识&#xff0c;包括AI行业现状&#xff0c;数学统计学&#xff0c;AI模型构建和模型基本概念。 之所以需要具备这些知识&#xff0c;是因为实现AI产品必然会涉及相应的AI技术&#xff0c;如果AI产品经理不了解相应技术基础&#xff0c;就不能很好的…

photoshop学习笔记——移动工具

移动工具&#xff0c;可以对图层进行移动&#xff0c;快捷键 V 使用的素材已经放上了&#xff0c;直接下载即可 按住ctrl 可以自动选取&#xff0c;鼠标点击哪个对象&#xff0c;自动选中哪个图层 按住 shift 校正角度&#xff08;只能沿着直线移动&#xff09; 按住 alt 拖…

llama模型,nano

目录 llama模型 Llama模型性能评测 nano模型是什么 Gemini Nano模型 参数量 MMLU、GPQA、HumanEval 1. MMLU(Massive Multi-task Language Understanding) 2. GPQA(Grade School Physics Question Answering) 3. HumanEval llama模型 Large Language Model AI Ll…

长期更新方法库推荐pmq-ui

# pmq-ui pmq-ui 好用方法库ui库, 欢迎您的使用 ## 安装 1. 克隆项目库到本地&#xff1a; 2. 进入项目目录&#xff1a;cd pmq-ui 3. 安装依赖&#xff1a;npm install pmq-ui ## 使用 <!-- 1. 启动应用&#xff1a; 2. 访问 [http://localhost:3000](http://localhost:300…

网络七层协议之 网桥、网卡、交换机、路由器、网关 作用

OSI七层模型 和 TCP/IP四层模型 数据传输单位、对应的设备 物理层&#xff1a;网线 数据链路层&#xff1a;网卡、网桥、交换机 网路层&#xff1a;路由器、网关 网卡的作用 网卡(Network Interface Card, NIC)是计算机上用于连接网络的硬件设备。 网卡是计算机连接网络、传…

机器学习实战笔记5数据标准化

1.读取csv文件实现特征化 import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler StandardScaler是一个用于标准化特征的工具&#xff0c;通过移除均值并缩放到单位方差来实现。 df pd.read_csv("./p039.csv") df scaler S…

windows10 安装CUDA教程

如何在windows10系统上安装CUDA? 1、查看电脑的NVIDIA版本 nvidia-smi 2、官网下载所需CUDA版本 官网地址:https://developer.nvidia.com/cuda-toolkit-archive 我们所安装的CUDA版本需要小于等于本机电脑的NVIDIA版本。推荐使用迅雷下载,速度会更快哦。 3、安装步骤

《你敢不学习?》numpy库——细细学<2>

续接上集: 1、reshape函数&#xff1a;重塑数组的形状 改变数组的维度 其语法为 numpy.reshape(arr, newshape, orderC) 如下图所示 首先生成一个1到17不包括17的16个元素的数组&#xff0c;然后对这个数组进行重塑&#xff0c;使其成为4行4列的二维数组&#xff0c;注意&…