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();
关闭套接字 注意: 在网络编程时, 获取输入输出流的操作 ,对于客户端与服务器来说是相对的 客户端的输入流, 输入的是服务器的输出流 输出的内容. 客户端的暑促刘, 输出到了服务器的输入流中. 所以 在使用时, 需要注意以下一点规则: 客户端与服务器获取流的顺序必须是相反的: 例如: 客户端先得到了输入流 , 那服务器必须先获取输出流
案例:
客户端:
Socket socket = new Socket("192.168.102.228",8888);
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(isr);
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("请输入要发送给服务器的内容:");
String text1 = input.nextLine();
ps.println(text1);
String text2 = br.readLine();
System.out.println(text2);
if("886".equals(text1)) {
break;
}
}
服务器:
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器已启动 , 等待客户端连接中...");
Socket socket = server.accept();
System.out.println("一个客户端连接成功:"+socket.getInetAddress().toString());
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
while(true) {
String text = br.readLine();
ps.println("服务器:"+text);
if("886".equals(text)) {
break;
}
}
 互相传递消息: 先启动服务器:  启动客户端:  在服务器中加入多线程方法(但是一定要保证顺序一方输入另一方输出): 
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之类的(你就把它理解成我们在电脑屏幕上可以看到的东西.就 是终端应用)。
 2
2 TCP/IP 原理
TCP/IP 协议不是 TCP 和 IP 这两个协议的合称,而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲,TCP/IP 由四个层次组成:网络接口层、网络层、传输层、应用层。 
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 连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。 
7 Http 状态
 
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) 如果确认证书有效,那么生成对称秘钥并使用服务器的公共秘钥进行加密。然后发送给服务器,服务器使用它的私钥对它进行解密,这样两台计算机可以开始进行对称加密进行通信。 
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); 案例: 
FastJson
j 
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 开始支持,标识某注解可以在同一个声明上使用多次。

关键字 用途 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 抑制没被使用过的代码的警告

 看另一个案例: 未加注解前,他是暗的  加了忽略所有警告后 变亮了: 
元注解
简介 作用在其他注解的注解 元注解有哪些? @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可 以通过反射访问。 @Documented - 标记这些注解是否包含在用户文档中 javadoc。 @Target - 标记这个注解应该是哪种 Java 成员。 @Inherited - 标记这个注解是自动继承的 
自定义注解:
 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,
CLASS,
RUNTIME
}
定义格式 @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。  可以传参  可以给默认值: 
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 类中的方法获取并查看该类中的方法和属性。 
Class clazz=Class.forName("reflection.Person");13/04/2018 Page 105 of 283
Method[] method=clazz.getDeclaredMethods();
for(Method m:method){
System.out.println(m.toString());
}
Field[] field=clazz.getDeclaredFields();
for(Field f:field){
System.out.println(f.toString());
}
Constructor[] constructor=clazz.getDeclaredConstructors();
for(Constructor c:constructor){
System.out.println(c.toString());
}
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(); 
访问私有构造方法时出错,因为我们写的那个私有方法是private。权限不允许  通过反射技术访问私有构造方法: 
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 则表示忽略访问权限检查 !(可以访问任何权限的方法) 
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 则表示忽略访问权限检查 !(可以访问任何权限的属性)

6.7 获取注解信息
获取类/属性/方法的全部注解对象 Annotation[] annotations01 = Class/Field/Method.getAnnotations(); for (Annotation annotation : annotations01) { System.out.println(annotation); } 根据类型获取类/属性/方法的注解对象 注解类型 对象名 = (注解类型) c.getAnnotation(注解类型.class);
这一篇文章对反射讲的比较通透
对反射讲的比较通俗易懂的个人感觉还不错 总的来说,学反射就一句话,动态编译的时候想起它,
|