浅析Java的反射机制

详解 反射机制 反射机制”,是一种RTI,即:运行时类型识别。 这个知识点,也是本人用以让同学们能够区分 C语言 和 Java语言的编程区别开来的一个重要知识点,并且,在我们今后的项目编程,以及深入学习中,这种机制是至关重要的。那么,废话不多说,现在开始这篇博文的主题的讲解吧 首先,本人先给出一个接口: IDoSomething.java: package com.mec.about_reflect.core;... 阅读详情

1、JAVA反射机制是指,在程序运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。之所以能做到这一点,靠的是java中Class类,该类是用于描述字节码文件的类,通过该类的实例化对象可以得到该对象所表示的类的所有信息,包括类中的构造器,字段,以及类方法。因此简单来说,反射机制可以理解成是对类的解剖。反射机制的作用是提高程序的扩展性和灵活性,使得程序可以便捷地增加或者修改功能。

2、我们以电脑主板的功能扩展为例来说明反射机制的实际应用,体会它带来的便捷性。首先创建一个MainBoard类,该类表示电脑主板

public class MainBoard {
	public void run(){
		System.out.println("mainboard run");
	}
	public void usePCI(PCI pci){
		if(pci!=null){
			pci.open();
			pci.close();
		}
	}
}
该类中有两个方法,run()表示使用主板的本身功能,usePCI()表示使用主板上插件的功能,该方法的参数便是一个插件对象。为了可以使用各种各样的插件,可以定义一个接口PCI,这样一来,只要某个插件实现PCI接口,那么该插件就可以被该主板所使用。(ps:这里也体现了java中的多态)

public interface PCI {
	public void open();
	public void close();
}
接下来我们就可以为该主板增加插件了,创建SoundCard类,表示声卡

//该类用于模拟声卡,要将其插在主板上,扩展主板的功能
public class SoundCard implements PCI{

	@Override
	public void open() {
		System.out.println("soundcard open...");
	}

	@Override
	public void close() {
		System.out.println("soundcard close...");
	}
	
}
创建主函数,运行主板

public class ReflectApp {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws Exception 
	 */
	//以电脑主板的功能扩展为例演示反射机制的应用,体现其强大的扩展性
	public static void main(String[] args) throws IOException, Exception {
		MainBoard mb = new MainBoard();
		mb.run();
		//读取配置文件,获得插件信息
		Properties prop = new Properties();
		File file = new File("pci.properties");
		FileReader fileReader = new FileReader(file);
		prop.load(fileReader);
		
		//加载配置文件中所写的类,对配置文件所写的插件类进行实例化,以此来使用插件的功能
		for (int i = 0; i < prop.size(); i++) {
			String key = "pci"+(i+1);
			Class clazz = Class.forName(prop.getProperty(key));
			PCI pci = (PCI) clazz.newInstance();
			mb.usePCI(pci);
		}	
	}
}
在主函数中调用主板的usePCI()方法时,需要传入一个具体的参数,也是说要指定具体的插件对象,这样做的弊端是:当我们以后想要使用其它插件或者增加插件时,就需要到源代码中修改方法的参数,将其替换成其它的插件。能不能不修改源代码就可以更换插件或者增加插件呢?反射机制便可以解决这个问题。因为它可以实现对象的动态获取,在这个例子中就是实现插件对象的动态获取,也就是说我们在程序运行时才指定具体使用哪个插件。那么如何来指定使用哪个插件呢?这需要我们来为程序写一个配置文件pci.properties,配置文件中的内容以键值对的形式给出,标明程序中要使用的插件类的名字。(ps:如果该类有包名,一定要加上包名)

pci1=SoundCard
这样一来,在程序运行时读取该配置文件,便可以拿到要使用的插件类的类名,一旦知道了类名,便可以通过Class类拿到该插件的实例化对象。这样便实现了对象的动态获取。如果想要更换插件或者增加插件,只需要修改配置文件即可,而无需修改源代码。

比如:我想增加一个网卡插件,那么只需创建一个网卡类,并在配置文件中增加一条配置信息即可

public class NetCard implements PCI {

	@Override
	public void open() {
		System.out.println("netcard open");
	}

	@Override
	public void close() {
		System.out.println("netcard close");
	}

}
修改配置文件

pci1=SoundCard
pci2=NetCard




2019美亚杯团体赛刷题 部分题解(1-42、106-116) 文章目录写在前面使用工具刷题1.在黑客路由器里,有一台设备的MAC地址为00:11:6B:47:4D:55,请问它的IP地址是什么?2.在黑客路由器里,发现一设备的IP地址为192.168.0.103,请问该设备为如下哪一个:3.警方已经查证所有连接此router的设备都归黑客所有,根據黑客路由器的訊息,下列哪组(设备---ip)是错误的:4.Hacker现场检获的Windows主机硬盘已成功取证并制作成镜像Win1.E01,下列哪个是其硬盘证据文件的MD5哈希值。5.MD5hash算法会产生一个什么大小的 阅读详情

相关推荐

JavaJava 反射机制浅析

1.概述 转载:https://www.cnblogs.com/gulvzhe/archive/2012/01/27/2330001.html Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射.

九师兄 553

Properties属性文件操作

java中有一种属性文件(资源文件)的定义:*.properties文件,在这种文件里面其内容的保存形式为 “key = value” ,通过ResourceBundle类读取的时候只能读取内容,要想编辑其内容则需要通过Properties类来完成,这个类是专门做属性处理的。 properties类的定义: //继承自Hashtable类 public class Properties exte...

qq_43508801的博客 758

注册GitHub时出现Unable to verify your captcha response.Please visit https://docs.github.com/解决方案(持续更新)

本文主要介绍了注册GitHub时出现Unable to verify your captcha response. Please visit https://docs.github.com/articles/troubleshooting-connectivity-problems/#troubleshooting-the-captcha for troubleshooting information.解决方案,希望能对学习使用GitHub的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

java 主板_Java 多态的主板示例

/*需求:电脑运行实例,电脑运行基于主板。*/interface PCI //扩展槽{public void open();public void close();}class MainBoard //主板{public void run(){System.out.println("mainboard run ");}public void usePCI(PCI p)//PCI p = new N...

weixin_30514003的博客 239

Java反射机制浅析

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

大鱼 1238

浅析Java中的反射机制原理

反射反射,程序员的快乐!        Java反射机制使用的还是比较广泛的,系统的灵活性、可扩展性大都都是通过反射等方式来加载外部插件,使得系统与插件解耦的同时,增加了功能。但是很多人都只是会用,却是不知道它的实现机制,今天就由我来带大家揭开反射机制的神秘面纱。        Java中是用Class.forName(classname)来反射类。 package com.j

崔成龙 . 勇往直前 4万+

浅析Java反射机制

这篇文章简单分析了Java反射机制. 反射机制十分强大,是Spring框架的核心

博言杂谈 377

Java 反射机制浅析

Java 反射机制浅析       Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机

IT张先生 454

Java反射机制浅析图+应用实例

转载自:http://blog.csdn.net/coder_pig/article/details/44784399 Java反射机制浅析图+应用实例 ——转载请注明出处:coder-pig 本节引言: 其实很久之前就想归纳一下Java中的这个反射机制了,前些天看了慕课网一个讲反射机制的 视频教程觉得不错,又复习了一下,今天面

satanmp的专栏 519

Class文件详解

引言        众所周知,Java语言有一个很重要的特点是平台无关性,即用Java语言编写的程序可以在不同平台之间无缝迁移,Java对这个特性有一个著名的宣传口号:“一次编写,到处运行(Write Once,Run AnyWhere)”。Java能够实现平台无关性的原因是它在平台之上提供了一个Java运行环境,也就是JVM,Sun公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟...

IT_GJW的博客 1万+

关于Java中整数类型数据的取值范围

要想分析数据的取值范围,首先应该明确两点:1.java中的数值型数据都是符号数,符号数由符号位和数值位两部分组成,符号位都是用0表示正数,用1表示负数2.java中是以补码来表示数值数据的,正数的补码是其本身,负数的补码是该数绝对值按位取反后再加1。所谓补码就是将二进制位取反再加1,比如二进制数0011的补码是1101。以byte类型的数据为例分析其取值范围:byte类型的数据占8个二进制位,由于...

IT_GJW的博客 1200

Java类的初始化

类的初始化是一个Java类生命周期中的其中一个阶段。如下图所示:生命周期中的前五个阶段(加载、验证、准备、解析、初始化)是一个类在JVM中的完整加载过程。初始化是类加载的最后一个阶段,也正是在初始化阶段,才会真正开始执行类中所写的Java代码。Java虚拟机规范中严格规定了有且只有四种情况必须立即对类进行初始化:1.遇到new、getstatic、putstatic、或者invoicestatic...

IT_GJW的博客 1195

浅析java.lang.Class类及其对象

1.Class类及其对象简介 Class类位于java.lang包中,父类是Object,该类的对象表示正在运行的 Java 应用程序中的类和接口。Class 类没有公共构造方法,Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。通俗来讲就是JVM会为每一个被加载的类创建一个对应的对象(即字节码文件在jvm中也是以对象的形式被jv

IT_GJW的博客 724

Java集合框架概述

Java集合框架类图概览 上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。 Java集合可以被分为两大类,一类是单列集合,这类集合的根接口是Collect...

IT_GJW的博客 632

Java异常处理机制

.Java中的异常类概述Java将程序中出现的异常情况封装成对象,用对象实例对异常情况进行描述。Java异常类层次结构图:从图中可以看出,所有的异常都是由Throwable继承而来,Throwable有两个直接子类:Error和Exception。Error是程序无法处理的错误,一般是Java运行时系统的内部错误和资源耗尽错误。例如Java虚拟机错误。出现这类错误,会导致程序的终止,无法对这类错...

IT_GJW的博客 417

JVM类加载机制

概述    虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。与那些在编译时需要进行连接工作的语言不同,在Java中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是为Java应用程序提供高度的灵活性。类加载的时机    类从被加载到虚拟机...

IT_GJW的博客 344

TIA PORTAL V20 UPD5更新包(2026.03最新)-链接地址

内容概要:本文提供了TIA PORTAL V20 UPD5更新包的下载信息,包含最新版本(2026.03发布)的ISO镜像文件,通过百度网盘分享链接进行获取。适合人群:从事工业自动化、PLC编程、工控系统开发的技术人员,以及需要使用或维护西门子TIA Portal软件的工程师和技术支持人员。; 使用场景及目标:①用于升级现有TIA Portal V20至UPD5版本,提升系统稳定性与功能性能;②在新设备上安装完整版TIA Portal V20 UPD5,支持S7-1200/1500等系列控制器的编程与调试;③配合HMI、驱动系统进行集成化工程设计与项目部署; 阅读建议:下载时请确保网络稳定,并验证文件完整性;建议具备基本的工控软件操作经验,在安装前做好系统兼容性检查,避免与其他版本冲突。

上一篇: 关于Java中整数类型数据的取值范围
下一篇: Tomcat服务器部署应用的三种方式
IT_GJW
博客等级 码龄12年 9粉丝 33原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值