二维码

java之-网络--注解---反射---xml

1137 人阅读 | 时间:2021年08月06日 10:39

1 网络编程

1 什么是计算机之间的通信协议

是计算机与计算机之间交流的标准 .

是对数据的 传输速率, 传入接口, 步骤控制 出错控制 等等 制定的一套标准 !

常用的通信协议:


http协议 : 超文本传输协议 . 80端口号

https协议: 安全的超文本传输协议 443端口号

ftp协议: 文件传输协议 21端口号

TCP协议: 传输控制协议

UDP协议: 数据报协议

2 网络编程的分类

1.B/S 程序 : 浏览器与服务器程序


2 C/S 程序 : 客户端与服务器程序


3 TCP协议 - OSI网络模型

指的是 从一台计算机的软件中, 将数据发送到另一台计算机的软件中的过程.

七层网络模型: 应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层


需要使用到两个类, 来编写TCP协议的 CS程序 .

1.ServerSocket 搭建服务器

2.Socket 搭建客户端

两方使用socket(套接字 , 通信端点) 进行交流


ServerSocket

用于创建服务器 . 创建完毕后, 会绑定一个端口号.

然后此服务器可以等待客户端连接 .

每连接一个客户端 , 服务器就会得到一个新的Socket对象, 用于跟客户端进行通信 .

常用构造方法

ServerSocket(int port); ****

创建一个基于TCP/IP协议的服务器 , 并绑定指定的端口号.

注意: 参数port的范围是: 0-65535 (建议1025-65535)

常用方法

Socket accept(); ****

等待客户端连接 .

此方法会导致线程的阻塞!

直到一个新的客户端连接成功, return Socket对象后, 线程在继续执行.

void close();

释放占用的端口号 , 关闭服务器.


Socket

是两台计算机之间通信的端点 , 是网络驱动提供给应用程序编程的一种接口 一套标准, 一种机制 .


构造方法:

Socket(String ip,int port) ****

创建一个套接字, 并连接指定ip和端口号的 服务器.

参数1. 服务器的ip地址

参数2. 服务器软件的端口号…


常用方法:


OutputStream getOutputStream();

返回的是 , 指向通信的另一端点的输出流

InputStream getInputStream();

返回的是 , 指向通信的另一端点的输入流

void close();

关闭套接字

注意:

在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的

客户端的输入流, 输入的是服务器的输出流 输出的内容.

客户端的暑促刘, 输出到了服务器的输入流中.

所以 在使用时, 需要注意以下一点规则:

客户端与服务器获取流的顺序必须是相反的:

例如:

客户端先得到了输入流 , 那服务器必须先获取输出流

案例:

客户端:
//1. 连接服务器
Socket socket = new Socket("192.168.102.228",8888);
//2. 得到输出流
//2.1 得到输出流
OutputStream os = socket.getOutputStream();
//2.2 将输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
//3. 得到输入流
//3.1 得到输入流
InputStream is = socket.getInputStream();
//3.2 将字节输入流, 转换为字符输入流 , 并转换为逐行读取流InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
//4. 循环接收用户输入
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("请输入要发送给服务器的内容:");
String text1 = input.nextLine();
//5. 将用户输入的内容, 发送给服务器
ps.println(text1);
//6. 接收服务器回复的消息
String text2 = br.readLine();
System.out.println(text2);
if("886".equals(text1)) {
break;
}
}
服务器:
public static void main(String[] args) throws Exception {
//1. 启动服务器, 并侦听8888端口号
ServerSocket server = new ServerSocket(8888);
//2. 打印提示
System.out.println("服务器已启动 , 等待客户端连接中...");
//3. 等待客户端连接
Socket socket = server.accept();
System.out.println("一个客户端连接成功:"+socket.getInetAddress().toString());
//4. 获取输入流
//4.1 获取输入流
InputStream is = socket.getInputStream();
//4.2 将输入的字节流 ,转换为字符流
InputStreamReader isr = new InputStreamReader(is);
//4.3 将字符流, 转换为逐行读取流
BufferedReader br = new BufferedReader(isr);
//5. 获取输出流
//5.1 获取输出流
OutputStream os = socket.getOutputStream();
//5.2 将字节输出流, 转换为打印流
PrintStream ps = new PrintStream(os);
while(true) {
//6. 循环读取一行行的数据 ,读取操作会导致线程的阻塞, 直到客户端真的发送了数据,
//服务器才能接到, 顺序继续执行下面的代码
String text = br.readLine();
//7. 将这个文字, 再打印给客户端
ps.println("服务器:"+text);
if("886".equals(text)) {
break;
}
}


java之-网络--注解---反射---xml


互相传递消息:
先启动服务器:


java之-网络--注解---反射---xml

启动客户端:

java之-网络--注解---反射---xml

在服务器中加入多线程方法(但是一定要保证顺序一方输入另一方输出):

java之-网络--注解---反射---xml

2网络的七层架构

1 七层架构

7 层模型主要包括:


物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的模数转换与数模转换)。这一层的数据叫做比特。

数据链路层:主要将从物理层接收的数据进行 MAC 地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。

网络层:主要将从下层接收到的数据进行 IP 地址(例 192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。

传输层:定义了一些传输数据的协议和端口号(WWW 端口 80 等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与 TCP 特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如 QQ 聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段进行传输,到达目的地址后在进行重组。

常常把这一层数据叫做段。

会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或或者接受会话请求(设备之间需要互相认识可以是 IP 也可以是 MAC 或者是主机名)

表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等))

应用层 主要是一些终端的应用,比如说FTP(各种文件下载),WEB(IE浏览),QQ之类的(你就把它理解成我们在电脑屏幕上可以看到的东西.就 是终端应用)。


java之-网络--注解---反射---xml




2 TCP/IP 原理

TCP/IP 协议不是 TCP 和 IP 这两个协议的合称,而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲,TCP/IP 由四个层次组成:网络接口层、网络层、传输层、应用层。


java之-网络--注解---反射---xml


3 TCP 三次握手/四次挥手

TCP 在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。


4 HTTP 原理

HTTP 是一个无状态的协议。无状态是指客户机(Web 浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.HTTP 遵循请求(Request)/应答(Response)模型。客户机(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有 HTTP 连接都被构造成一套请求和应答。


4.1 传输流程

1:地址解析

如用客户端浏览器请求这个页面:http://localhost.com:8080/index.html 从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:

协议名:http

主机名:localhost.com

端口:8080

对象路径:/index.html

在这一步,需要域名系统 DNS 解析域名 localhost.com,得主机的 IP 地址。


2:封装 HTTP 请求数据包

把以上部分结合本机自己的信息,封装成一个 HTTP 请求数据包


3:封装成 TCP 包并建立连接

封装成 TCP 包,建立 TCP 连接(TCP 的三次握手)


4:客户机发送请求命

4)客户机发送请求命令:建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资

源标识符(URL)、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和可内容。


5:服务器响应

服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。


6:服务器关闭 TCP 连接

服务器关闭 TCP 连接:一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接,然后如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive,TCP 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

java之-网络--注解---反射---xml


7 Http 状态

java之-网络--注解---反射---xml

java之-网络--注解---反射---xml


5 HTTPS

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL。其所用的端口号是 443。 过程大致如下

建立连接获取证书

1) SSL 客户端通过 TCP 和服务器建立连接之后(443 端口),并且在一般的 tcp 连接协商(握手)过程中请求证书。即客户端发出一个消息给服务器,这个消息里面包含了自己可实现的算法列表和其它一些需要的消息,SSL 的服务器端会回应一个数据包,这里面确定了这次通信所需要的算法,然后服务器向客户端返回证书。(证书里面包含了服务器信息:域名。申请证书的公司,公共秘钥)。

证书验证

2) Client 在收到服务器返回的证书后,判断签发这个证书的公共签发机构,并使用这个机构的公共秘钥确认签名是否有效,客户端还会确保证书中列出的域名就是它正在连接的域名。数据加密和传输

3) 如果确认证书有效,那么生成对称秘钥并使用服务器的公共秘钥进行加密。然后发送给服务器,服务器使用它的私钥对它进行解密,这样两台计算机可以开始进行对称加密进行通信。

java之-网络--注解---反射---xml


3 XML

Java中有几种XML解析方式 ? 分别是什么 ? 有什么样的优缺点 ?

答: 四种.


1. SAX解析

解析方式是事件驱动机制 !

SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触发事件.我们可以编写程序在这些事件发生时, 进行相应的处理.

优点:

分析能够立即开始,而不是等待所有的数据被处理逐行加载,节省内存.有助于解析大于系统内存的文档有时不必解析整个文档,它可以在某个条件得到满足时停止解析.

缺点:

1.单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐

行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了).

2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系.

3. 只读解析方式, 无法修改XML文档的内容.


2. DOM解析

是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.

优点:

文档在内存中加载, 允许对数据和结构做出更改.

访问是双向的,可以在任何时候在树中双向解析数据。

缺点:

文档全部加载在内存中 , 消耗资源大.


3. JDOM解析

目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。

JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)

优点:

使用具体类而不是接口,简化了DOM的API。

大量使用了Java集合类,方便了Java开发人员。

缺点:

没有较好的灵活性。

性能不是那么优异。


4. DOM4J解析

它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。

目前许多开源项目中大量采用DOM4J , 例如:Hibernate。


DOM4J解析XML 掌握

步骤:


引入jar文件 dom4j.jar

创建一个指向XML文件的输入流

FileInputStream fis = new FileInputStream(“xml文件的地址”);

创建一个XML读取工具对象

SAXReader sr = new SAXReader();

使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象

Document doc = sr.read(fis);

通过文档对象, 获取XML文档中的根元素对象

Element root = doc.getRootElement();

xml文档有两种定义方法:

dtd:数据类型定义(data type definition),用以描述XML文档的文档结构,是早期的XML文档定义形式。

schema:其本身是基于XML语言编写的,在类型和语法上的限定能力比dtd强,处理也比较方便,因为此正逐渐代替dtd成为新的模式定义语言。


4 JSON

JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式.


Java和JSON可以互相转换。


Json分为两种 :


Gson

将对象转换成JSON字符串


转换JSON字符串的步骤:


引入JAR包

在需要转换JSON字符串的位置编写如下代码即可:

String json = new Gson().toJSON(要转换的对象);

案例:

Book b = BookDao.find();

String json = new Gson().toJson(b);

System.out.println(json);

将JSON字符串转换成对象:


引入JAR包

在需要转换Java对象的位置, 编写如下代码:

对象 = new Gson().fromJson(JSON字符串,对象类型.class);

案例:

java之-网络--注解---反射---xml

FastJson

java之-网络--注解---反射---xml


5 注解

简介

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。

Java 语言中的类、方法、变量、参数和包等都可以被标注。和注释不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

主要用于:

编译格式检查 反射中解析 生成帮助文档 跟踪代码依赖等

学习的重点

理解 Annotation 的关键,是理解 Annotation 的语法和用法.


内置注解

@Override : 重写 *

定义在java.lang.Override

@Deprecated:废弃 *

private Level(int levelValue) {

this.levelValue = levelValue;

}

public int getLevelValue() {

return levelValue;

}

}


概念定义在java.lang.Deprecated

@SafeVarargs

Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。

@FunctionalInterface: 函数式接口 *

Java 8 开始支持,标识一个匿名函数或函数式接口。

@Repeatable:标识某注解可以在同一个声明上使用多次

Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

java之-网络--注解---反射---xml


关键字 用途

all 抑制所有警告

boxing 抑制装箱、拆箱操作时候的警告

cast 抑制映射相关的警告

dep-ann 抑制启用注释的警告

deprecation 抑制过期方法警告

fallthrough 抑制确在switch中缺失breaks的警告

finally 抑制finally模块没有返回的警告

hiding 抑制相对于隐藏变量的局部变量的警告

incomplete-switch 忽略没有完整的switch语句

nls 忽略非nls格式的字符

null 忽略对null的操作

rawtypes 使用generics时忽略没有指定相应的类型

restriction 抑制禁止使用劝阻或禁止引用的警告

serial 忽略在serializable类中没有声明serialVersionUID变量

static-access 抑制不正确的静态访问方式警告

synthetic-access 抑制子类没有按最优方法访问内部类的警告

unchecked 抑制没有进行类型检查操作的警告

unqualified-field-access 抑制没有权限访问的域的警告

unused 抑制没被使用过的代码的警告

java之-网络--注解---反射---xml


java之-网络--注解---反射---xml



java之-网络--注解---反射---xml

java之-网络--注解---反射---xml


01) Annotation与RetentionPolicy 与ElementType 。

每 1 个 Annotation 对象,都会有唯一的 RetentionPolicy 属性;至于 ElementType 属性,则有 1~n个。


(02) ElementType(注解的用途类型)

“每 1 个 Annotation” 都与 “1~n 个 ElementType” 关联。当 Annotation 与某个 ElementType 关联时,就意味着:Annotation有了某种用途。例如,若一个 Annotation 对象是 METHOD 类型,则该Annotation 只能用来修饰方法。


package java.lang.annotation;
public enum ElementType {
TYPE, /* 类、接口(包括注释类型)或枚举声明 */
FIELD, /* 字段声明(包括枚举常量) */
METHOD, /* 方法声明 */
PARAMETER, /* 参数声明 */
CONSTRUCTOR, /* 构造方法声明 */
LOCAL_VARIABLE, /* 局部变量声明 */
ANNOTATION_TYPE, /* 注释类型声明 */
PACKAGE /* 包声明 */
}

(03) RetentionPolicy(注解作用域策略)。

“每 1 个 Annotation” 都与 “1 个 RetentionPolicy” 关联。

a) 若 Annotation 的类型为 SOURCE,则意味着:Annotation 仅存在于编译器处理期间,编译器处理完之后,该 Annotation 就没用了。 例如," @Override" 标志就是一个 Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,"@Override" 就没有任何作用了。

b) 若 Annotation 的类型为 CLASS,则意味着:编译器将 Annotation 存储于类对应的 .class 文件中,它是 Annotation 的默认行为。

c) 若 Annotation 的类型为 RUNTIME,则意味着:编译器将 Annotation 存储于 class 文件中,并且可由JVM读入。


package java.lang.annotation;
public enum RetentionPolicy {
SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该
Annotation信息了 */
CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */
RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}



定义格式

@interface 自定义注解名{}

注意事项


定义的注解,自动继承了java.lang,annotation.Annotation接口

注解中的每一个方法,实际是声明的注解配置参数

方法的名称就是 配置参数的名称

方法的返回值类型,就是配置参数的类型。只能是:基本类型/Class/String/enum

可以通过default来声明参数的默认值

如果只有一个参数成员,一般参数名为value

注解元素必须要有值,我们定义注解元素时,经常使用空字符串、0作为默认值。

7 案例

@Documented

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface MyAnnotation1 {

参数类型 参数名() default 默认值;

}

上面的作用是定义一个 Annotation,我们可以在代码中通过 “@MyAnnotation1” 来使用它。

@Documented, @Target, @Retention, @interface 都是来修饰 MyAnnotation1 的。含义:

(01) @interface

使用 @interface 定义注解时,意味着它实现了 java.lang.annotation.Annotation 接口,即该注解就是一个Annotation。

定义 Annotation 时,@interface 是必须的。

注意:它和我们通常的 implemented 实现接口的方法不同。Annotation 接口的实现细节都由编译器完成。通过 @interface 定义注解后,该注解不能继承其他的注解或接口。

(02) @Documented

类和方法的 Annotation 在缺省情况下是不出现在 javadoc 中的。如果使用 @Documented 修饰该Annotation,则表示它可以出现在 javadoc 中。

定义 Annotation 时,@Documented 可有可无;若没有定义,则 Annotation 不会出现在 javadoc中。

(03) @Target(ElementType.TYPE)

前面我们说过,ElementType 是 Annotation 的类型属性。而 @Target 的作用,就是来指定Annotation 的类型属性。

@Target(ElementType.TYPE) 的意思就是指定该 Annotation 的类型是 ElementType.TYPE。这就意味着,MyAnnotation1 是来修饰"类、接口(包括注释类型)或枚举声明"的注解。定义 Annotation 时,@Target 可有可无。若有 @Target,则该 Annotation 只能用于它所指定的地方;若没有 @Target,则该 Annotation 可以用于任何地方。

(04) @Retention(RetentionPolicy.RUNTIME)

前面我们说过,RetentionPolicy 是 Annotation 的策略属性,而 @Retention 的作用,就是指定Annotation 的策略属性。

@Retention(RetentionPolicy.RUNTIME) 的意思就是指定该 Annotation 的策略是

RetentionPolicy.RUNTIME。这就意味着,编译器会将该 Annotation 信息保留在 .class 文件中,并且能被虚拟机读取。

定义 Annotation 时,@Retention 可有可无。若没有 @Retention,则默认是

RetentionPolicy.CLASS。


java之-网络--注解---反射---xml


可以传参

java之-网络--注解---反射---xml


可以给默认值:

java之-网络--注解---反射---xml


6 反射

JAVA反射机制是在运行状态中,获取任意一个类的结构 , 创建对象 , 得到方法,执行方法 , 属性 !;这种在运行状态动态获取信息以及动态调用对象方法的功能被称为java语言的反射机制。


6.1 反射的应用场合

编译时类型和运行时类型

在 Java 程序中许多对象在运行时都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如:Person p=new Student();其中编译时类型为 Person,运行时类型为 Student。的编译时类型无法获取具体方法

程序在运行时还可能接收到外部传入的对象,该对象的编译时类型为 Object,但是程序有需要调用该对象的运行时类型的方法。为了解决这些问题,程序需要在运行时发现对象和类的真实信息。然而,如果编译时根本无法预知该对象和类属于哪些类,程序只能依靠运行时信息来发现该对象和类的真实信息,此时就必须使用到反射了。


6.2 Java 反射 API

反射 API 用来生成 JVM 中的类、接口或则对象的信息。


Class 类:反射的核心类,可以获取类的属性,方法等信息。

Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。

Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或

者执行方法。

Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。

6.3 获取 Class 对象的 3 种方法

1 调用某个对象的 getClass()方法

Person p=new Person();

Class clazz=p.getClass();

2 调用某个类的 class 属性来获取该类对应的 Class 对象

Class clazz=Person.class;

3 使用 Class 类中的 forName()静态方法(最安全/性能最好)

Class clazz=Class.forName(“类的全路径”); (最常用)

当我们获得了想要操作的类的 Class 对象后,可以通过 Class 类中的方法获取并查看该类中的方法和属性。


java之-网络--注解---反射---xml



java之-网络--注解---反射---xml



6.4 反射中的构造方法

1 通过指定的参数类型, 获取指定的单个构造方法

getConstructor(参数类型的class对象数组)

例如:

构造方法如下: Person(String name,int age)

得到这个构造方法的代码如下:

Constructor c = p.getClass().getConstructor(String.class,int.class);

2. 获取构造方法数组

getConstructors();

3. 获取所有权限的单个构造方法

getDeclaredConstructor(参数类型的class对象数组)

4. 获取所有权限的构造方法数组

getDeclaredConstructors();

java之-网络--注解---反射---xml


java之-网络--注解---反射---xml


6.5 获取Method方法:

getMethod(String methodName , class… clss)

根据参数列表的类型和方法名, 得到一个方法(public修饰的)

getMethods();

得到一个类的所有方法 (public修饰的)

getDeclaredMethod(String methodName , class… clss)

根据参数列表的类型和方法名, 得到一个方法(除继承以外所有的:包含私有, 共有, 保护, 默认)

getDeclaredMethods();

得到一个类的所有方法 (除继承以外所有的:包含私有, 共有, 保护, 默认)

Method执行方法

invoke(Object o,Object… para) :

调用方法 ,

参数1. 要调用方法的对象

参数2. 要传递的参数列表

getName()

获取方法的方法名称

setAccessible(boolean flag)

如果flag为true 则表示忽略访问权限检查 !(可以访问任何权限的方法)

java之-网络--注解---反射---xml


6.6 获取Field

getDeclaredField(String filedName)

根据属性的名称, 获取一个属性对象 (所有属性)

getDeclaredFields()

获取所有属性

getField(String filedName)

根据属性的名称, 获取一个属性对象 (public属性)

getFields()

获取所有属性 (public)

Field属性的对象类型

常用方法:

get(Object o );

参数: 要获取属性的对象

获取指定对象的此属性值

set(Object o , Object value);

参数1. 要设置属性值的 对象

参数2. 要设置的值

设置指定对象的属性的值

getName()

获取属性的名称

setAccessible(boolean flag)

如果flag为true 则表示忽略访问权限检查 !(可以访问任何权限的属性)


java之-网络--注解---反射---xml


6.7 获取注解信息

获取类/属性/方法的全部注解对象

Annotation[] annotations01 = Class/Field/Method.getAnnotations();

for (Annotation annotation : annotations01) {

System.out.println(annotation);

}

根据类型获取类/属性/方法的注解对象

注解类型 对象名 = (注解类型) c.getAnnotation(注解类型.class);


这一篇文章对反射讲的比较通透


对反射讲的比较通俗易懂的个人感觉还不错

总的来说,学反射就一句话,动态编译的时候想起它,













取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
关闭广告
关闭广告
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×