黑马程序员——java复习总结——反射

本文详细介绍了Java反射机制的基础概念,包括Class类的获取方式、特点,以及如何利用反射进行构造方法、成员变量、成员方法的获取与操作。同时,文章还展示了如何使用反射执行特定类的main方法,并探讨了数组的反射特性。

------- android培训java培训、期待与您交流! ----------

一、Class类

 

1.1  Class类的概念

Class类可以说是反射的基石。在java程序中的各个java类属于同一事物,描述这类事物的java类名就是Class。

Class类代表java类,它的各个实例对象就是各个类在内存中的字节码,例如Person类的字节码,ArrayList类的字节码等等,一个类被类加载器加载到内存中,这个空间里面的内容就是累的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个对象表示,这些对象显然具有相同的类型,这个类型就是Class类。

 

1.2 Class类的获取方式

Class类没有构造函数,不能通过new获得,想要活动Class类有三种方式:

第一种:

类名.Class。如要获取Date类的字节码:Date.class

第二种:

对象.getClass().如,要获取String类的字节码,若str是String的一个实例对象,则可以用str.getClass()获得String的字节码。

 

第三种:

Class.forName(“类名”)。如要获取String的字节码,可以这样写:Class.forName(“java.lang.String”);

 

1.3 Class类的特点

对于Class,同一个类的字节码是唯一的,所以若有多个对象指向同一个类的字节码,则它们是相等的,可以用== 进行比较。

 

二、反射

 

2.1  反射的概念

反射就是把java类中,各种成分映射成相应的java类,例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造函数,包等等信息也可以用一个个java类来表示,就像汽车是一个类,汽车的发动机,变速箱等等也是一个个类。

所以,java类中提供了Class类来提供了一系列方法,来获得其中的变量,方法,构造方法,修饰符,包等信息。这些信息就是用相应类的实例对象来表示,他们分别是Field,Method,Contructor.Package等等。

2.2 Constructor类

Constructor类代表某个类中的一个构造方法,得到某个类所以的构造方法:

Constructor constructors[]  =  Class.forName(“java.lang.String”).getConstructs();

 

得到某个类某一个构造方法:

Constructor constructor  =  Class.forName(“java.lang.String”).getConstruct(“参数类型”);这样就可以获得对应参数类型的构造方法

 

通过这些构造方法,就可以获得对应类的对象。如

String str  =  (String)constructor.newInstance(newStringBuffer(“abc”));

 

2.3  Field类

Field类代表某个类中的一个成员变量,通过他就可以获得该变量的值,哪怕该变量是私有变量

 

如下,就是一个使用反射的例子

 

2.4 Method类

Method类代表某一个类中的一个成员方法,得到类中的某一个方法如下:

Method MethodcharAt = Class,forName(“java.lang.String”).getMethod(“charAt”,intclass)

这个方法有两个参数,第一个是方法名,要得到什么方法就传入什么名字,第二个是方法的参数,因为方法有重载,所以需要传入对应的参数。

 

使用过程是先得到方法,然后再对于某个对象调用这个方法。

调用方法:invoke(对象,参数);调用这个方法,需要传入两个参数,要调用哪个对象身上的方法,需要传入对应的对象。如果对象的null,那么说明这个方法是静态的。然后使用什么参数,也需要传入对应的参数。如果传入多个参数,那么可以传入多个参数,这是因为此处的可变参数。

如下就是对这个方法是使用:

MethodcharAt.innvoke(str,1);就是要调用str身上的这个方法,参数是1.

 

2.5  用反射的方式执行某个类中的main方法

 

用处:当要运行的类未知时,可以使用参数用于接受该类的类名,然后通过类名获得该类的main方法,然后传入参数运行这个main方法。这样就可以在写程序的时候,利用反射的特点,将程序的功能实现,后期传入需要运行的类名就行了。

 

2.6  数组的反射

数组也是一种类型,具有相同维数和元素类型的数组属于同一个类型,他们具有相同的Class实例对象。代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类的对应Class。

 

注意:基本类型的一维数组只能整体被当做一个Object类型使用,即一个对象。不能当做Object[]类型使用,因为它们里面封装的基本类型的数据并不是对象。非基本类型的一维数组,既可以当做Object类型使用,也可以当做Object[]类型使用。

例如:


对于这两个比较,第一个是true,第二个是false。

对于这些数组,父类都是Object。

如下,就是对数组进行反射的例子


### TCP传输原理与实现 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。其核心原理是通过建立端到端的连接,确保数据在不可靠的网络中能够可靠地传输。TCP 使用确认机制、流量控制、拥塞控制等机制来保障数据的完整性和有序性。 在 Java 中,TCP 通信可以通过 `Socket` 和 `ServerSocket` 类实现。客户端使用 `Socket` 连接到服务器,服务器端使用 `ServerSocket` 监听连接请求。通信过程中,数据通过输入流和输出流进行传输。 #### 客户端实现 客户端的主要任务是与服务器建立连接,并通过输出流向服务器发送数据,同时可以通过输入流接收服务器的响应。例如: ```java Socket s = new Socket(InetAddress.getLocalHost(), 10004); OutputStream out = s.getOutputStream(); out.write("Hello TCPClient".getBytes()); InputStream is = s.getInputStream(); byte[] buffer = new byte[1024]; int len = is.read(buffer); System.out.println(new String(buffer, 0, len)); s.close(); ``` 该代码实现了客户端与服务器的连接,并发送了一条文本消息,同时接收服务器的响应[^1]。 #### 服务端实现 服务端通过 `ServerSocket` 监听指定端口,等待客户端连接。一旦连接建立,服务端通过输入流接收客户端发送的数据,并通过输出流向客户端发送响应。例如: ```java ServerSocket ss = new ServerSocket(10012); Socket s = ss.accept(); InputStream in = s.getInputStream(); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); PrintWriter out = new PrintWriter(s.getOutputStream(), true); out.println("<font color='red' size=7>客户端s你好</font>"); s.close(); ss.close(); ``` 该代码展示了如何在服务端接收客户端发送的数据,并向客户端发送 HTML 格式的响应[^3]。 #### TCP连接的建立与释放 TCP 连接的建立采用三次握手(Three-way Handshake): 1. 客户端发送 SYN(同步)报文给服务器,表示请求建立连接。 2. 服务器收到 SYN 报文后,发送 SYN-ACK(同步-确认)报文作为响应。 3. 客户端收到 SYN-ACK 后,发送 ACK(确认)报文,连接建立。 连接的释放采用四次挥手(Four-way Handshake): 1. 客户端发送 FIN(结束)报文,表示数据发送完成。 2. 服务器发送 ACK 报文,确认收到 FIN。 3. 服务器发送 FIN 报文,表示数据发送完成。 4. 客户端发送 ACK 报文,连接关闭。 #### TCP的可靠性机制 TCP 通过以下机制确保数据的可靠传输: - **确认机制**:接收方收到数据后,向发送方发送确认信息。 - **重传机制**:如果发送方未收到确认信息,则重传数据。 - **流量控制**:通过滑动窗口机制,控制发送速率,避免接收方缓冲区溢出。 - **拥塞控制**:通过慢启动、拥塞避免等算法,防止网络拥塞。 #### TCP的编程模型 TCP 编程模型通常包括以下几个步骤: 1. **创建 Socket**:客户端创建 `Socket` 对象,连接服务器;服务端创建 `ServerSocket` 对象,监听端口。 2. **获取流对象**:获取 `Socket` 的输入流和输出流,用于数据传输。 3. **数据读写**:通过输入流读取数据,通过输出流写入数据。 4. **关闭连接**:通信结束后,关闭 `Socket` 和流对象。 ### 示例代码:完整的 TCP 通信 以下是一个完整的 TCP 通信示例,包含客户端和服务端的代码。 #### 客户端代码 ```java import java.io.*; import java.net.*; public class TcpClient { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8888); OutputStream out = socket.getOutputStream(); out.write("Hello Server!".getBytes()); InputStream in = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println("Server response: " + new String(buffer, 0, len)); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` #### 服务端代码 ```java import java.io.*; import java.net.*; public class TcpServer { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("Server is listening on port 8888..."); Socket socket = serverSocket.accept(); InputStream in = socket.getInputStream(); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println("Client message: " + new String(buffer, 0, len)); OutputStream out = socket.getOutputStream(); out.write("Hello Client!".getBytes()); socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值