黑马程序员——Java新技术反射技术2

本文深入探讨Java反射技术的原理、主要应用及其在不同场景中的实现,包括动态创建对象、接口实现与调用、JavaBean类数据传递、动态代理等。通过实例展示了如何利用反射机制提高程序的灵活性和扩展性。

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

初步了解了反射技术的原理以及作用,今天来研究一下Java中反射技术的主要应用。反射机制的主要作用是在运行时状态中,对于给定的一个类都可以获取到该类的属性和方法;对于任意的一个对象都可以获取到其属性值和调用其方法执行某些功能。因此,反射机制的主要应用包括以下几个方面:

1、可以再不确定类名的情况下,在运行时状态下动态的去创建需要类型的对象,并可对对象设置信息和执行功能。

Class cls=Class.forName(className);
//可以直接通过Class的newInstance方法创建对象,注意此时只能调用不带参数的构造函数
Object obj=cls.newInstance();
//带参数的构造函数,创建对象
Class[] paraType=new Class[]{p1Class,p2Class};//p1Class,p2Class分别对应于构造方法中的两个参数类型的Class对象
Constructor con=cls.getConstructor(paraType);
Object obj1=con.newInstance(p1,p2);//p1,p2为实际传递给构造函数的数据

2、反射技术大量用于Java设计模式和框架技术,例如在软件设计阶段为了完成某个功能会给程序员提供一个接口,一个员工负责去使用接口,另一个员工去负责实现接口,为了高效工作两个人同时并发进行,那么,在使用接口的时候由于不知道其子类的名称无法直接创建对象去调用接口方法,那么这时就可以利用反射技术,从配置文件中读取具体类名即可调用其方法执行功能;那么另外一端,完成接口子类的实现后可以将其具体类名直接设置到配置文件即可,这样使工作效率更高,而且使程序更具有扩展性,降低了类与类直接的耦合性。
eg:定义一个接口信息,用子类将其方法实现,然后在另外一处使用时用读取配置文件的方式,在运行时调用对象去访问子类实现的接口方法。

 interface FunctionInterface
 {
	 void executeFun();
 }
 class Function implements FunctionInterface
 {
	 public void executeFun()
	 {
		 System.out.println("The Function's executeFun is running...");
	 }
 }

然后,在另外一个功能类中去加载配置文件并执行接口功能,提高程序扩展性

import java.lang.reflect.*;
import java.util.*;
import java.io.*;
class  Demo
{
	public static void main(String[] args) throws Exception
	{
		//读取硬盘上的配置文件
		InputStream in=new FileInputStream("configuration.properties");
		//创建properties对象,并加载配置文件输入流信息
		Properties prop=new Properties();
		prop.load(in);

		//获取配置文件中的className的属性信息
		String className=prop.getProperty("className");
		//获取接口实现类的字节码文件对象
		Class cls=Class.forName(className);
		//创建接口对象,创建对象时使用无参构造函数可以直接用Class对象
		//的newInstance方法,而需要传递参数则要创建Constructor对象
		FunctionInterface inter=(FunctionInterface)cls.newInstance();

		inter.executeFun();
	}
}
 interface FunctionInterface
 {
	 void executeFun();
 }

3、JavaBean类中用到的反射技术。JavaBean是Java中一种比较特殊的类,该类型的对象提供了一组用于读取和设置属性的公共方法,而且,方法的命名规则一般是set或get动作加上属性名(属性名首字母大写)的形式,所以,可以通过使用公共方法可在模块间对对象的属性信息进行传递。该类型对象一般用于在模块间传递数据信息,通过获取一个对象的属性,即可知道对于的设置和读取操作方法名,然后,利用反射机制调用公共方法达到传递数据的目的。eg:

定义一个JavaBean类,注意必须是公共类,在独立的.java文件中声明。其TextFormatBean.java内容为:

//创建一个定义文本格式的JavaBean类,基本属性有字体名称、颜色、大小信息
public class TextFormatBean
{
	private String fontName;//字体名称
	private String fontColor;//字体颜色
	private int fontSize;//字体大小
	TextFormatBean()
	{
		this.fontName="宋体";
		this.fontColor="黑色";
		this.fontSize=12;
	}
	//设置属性信息
	public void setFontName(String name)
	{
		this.fontName=name;
	}
	public void setFontColor(String color)
	{
		this.fontColor=color;
	}
	public void setFontSize(int size)
	{
		this.fontSize=size;
	}
	
	//读取属性信息
	public String getFontName()
	{
		return fontName;
	}
	public String getFontColor()
	{
		return fontColor;
	}
	public int getFontSize()
	{
		return fontSize;
	}

	public String toString()
	{
		return "文本格式:"+fontName+" "+fontColor+" "+fontSize;
	}
}

在BeanDemo.java中对JavaBean类对象进行数据读取和设置——原理就是利用了Java反射机制

import java.io.*;
import java.lang.reflect.*;
import java.beans.*;

class  BeanDemo
{
	public static void main(String[] args) throws Exception
	{
		TextFormatBean text=new TextFormatBean();
		System.out.println(text.toString());

		//获取对象属性——字体颜色
		Class cls=text.getClass();
		//属性名信息,可以通过读取配置文件方式来获取
		String propertyName="fontColor";
		//创建PropertyDescriptor对象,调用其getReadMethod或getWriteMethod方法,获取读取和设置属性的方法
		PropertyDescriptor pd=new PropertyDescriptor(propertyName,cls);
		//获取设置方法对象,其原理就是利用反射技术
		Method set1=pd.getWriteMethod();
		//访问原类的设置属性方法,设置字体颜色信息
		set1.invoke(text,"红色");
		System.out.println(text.toString());
	}

}
运行结果:

4、在动态代理中也用到了反射技术,后面的日记会有所涉及。


内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与神经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
### 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、付费专栏及课程。

余额充值