反射机制(5)—— 反射机制 和 properties文件的联合使用

本文详细介绍了如何结合反射机制与properties配置文件进行动态类加载和实例化,展示了反射机制在处理未知类时的强大能力,及其与接口、XML解析的结合应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在本专题《详解 反射机制》之前的博文中,本人将所有有关 反射机制的基本使用方式都讲解完了,但是,为什么本人还要用一片博文来展示 反射机制 和 properties文件的联合使用 呢?
答曰:反射机制和properties文件或是和XML文件的联动,是我们后期学习中框架那里的核心。所以,本人先来浅浅地讲解一下基本使用方法:

反射机制 和 properties文件的联合使用:

那么,现在,本人通过一个例子来实现一下“反射机制”:
在本人开始根据以上的知识来举例之前,先借用一下本人在上篇博文中的知识来编写一个properties文件(相关知识点请观看本人博文——《Properties 解析》):
class.properties:

class=com.mec.complex.Complex

那么,现在本人肯定要引用一下我们在上一篇博文中所做的解析properties文件的“工具”类:
PropertiesParser.java:

package com.mec.util.Properties;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class PropertiesParser {
	private static final Map<String, String> propertyMap ;
	
	static {
		propertyMap = new HashMap<>();
	}
	//上面的代码,等价于:
	//private static final Map<String, String> propertyMap = new HashMap<>();
	
	public PropertiesParser() {
	}
	
	public static void loadProperties(String path) {
		InputStream is = PropertiesParser.class.getResourceAsStream(path);
		loadProperties(is);
	}
	
	public static void loadProperties(InputStream is) {
		Properties properties = new Properties();	
		try {
			properties.load(is);
			Set<Object> keySet = properties.keySet();
			Iterator<Object> iterator = keySet.iterator();
			while(iterator.hasNext()) {
				String key = (String) iterator.next();
				String value = properties.getProperty(key);
				propertyMap.put(key, value);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static String value(String key) {
		return propertyMap.get(key);
	}
}

至于对上面知识不明白的同学,真的建议先去观看下本人的同专栏博文——《Properties 解析》

那么,现在本人给出一个能够应用反射机制的类:
Test.java:

package com.mec.about_reflect.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.mec.util.PropertiesParser;

public class Test {

	public static void main(String[] args) {
		PropertiesParser property = new PropertiesParser();	//首先,我们new了一个“工具”类的对象
		property.loadProperties("/class.properties");	//解析class.properties文件
		String className = property.value("class");	//读取class.properties文件中,键为class的值
		System.out.println(className);	//这里是本人为了检测取出的类名是否正确加上的
		try {	//这里是对异常的处理,相关知识点在本人之前的博文中讲解过
			Class<?> klass = Class.forName(className);	//这里的Class类就是我们用于体现反射机制的类,forName方法的功能是将klass“看作”名为 参数className 的类
			Object obj = klass.newInstance();		// 这里,本质上是调用了相关类的无参构造方法
			System.out.println("obj:" + obj + ", " + obj.getClass());
			
			Constructor<?> constructor = klass.getConstructor(double.class, double.class);	//这里的Constructor类也是我们用于体现反射机制的类,这个类的主要功能是使用构造方法
			Object object = constructor.newInstance(3.14, -2.4);
			System.out.println("object:" + object + ", " + obj.getClass());
			
			Method method = klass.getDeclaredMethod("add", klass);	//这里的Method类也是我们用于体现反射机制的类,这个类的主要功能是使用该类中的方法用的
			method.invoke(obj, object);
			System.out.println("obj:" + obj + ", " + obj.getClass());
			
			Field field = klass.getDeclaredField("real");	//这里的Field类也是我们用于体现反射机制的类,这个类的主要功能是使用该类中的成员用的
			//这里还是要提醒一点:因为我们在Complex中的成员real是private修饰的,所以我们想用的时候,就必须用getDeclaredField方法。
			field.setAccessible(true);	//这行代码的作用是:使得real具备可读性
			field.set(object, 123.45);
			System.out.println("object:" + object);
			
			Field virField = klass.getDeclaredField("vir");
			String fieldName = virField.getName();
			String methodName = "set" + fieldName.substring(0, 1).toUpperCase() 
					+ fieldName.substring(1);
			Method m = klass.getDeclaredMethod(methodName, virField.getType());
			m.invoke(object, -4321.76545);	//invoke方法的参数要求:1.第一个参数必须是调用这个方法的对象的类的对象;2.后续的参数就是调用相应的方法中所需要的参数
			
			System.out.println("object:" + object);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
	}

}

有很多同学之前问我:’?'是什么意思
答曰:就相当于我们用泛型时定义的Object类,是所有类的“基类”级别的关键字

那么,现在我们来看看运行结果:
在这里插入图片描述
我们能够从上面的例子中看出,当我们学习了反射机制的相关知识后,与接口、XML文件解析、Properties文件的解析的知识相结合运用,完全可以处理未知的类。

这个联动,不知道是否让同学们震惊,但是它是真的让本人对此感叹。
框架,用的就是“反射机制”的这种可以联动的特点,所以啊,这里的知识点,本人再三强调十分有用,希望同学们能够彻底搞懂这篇博文的知识点,否则是真的在今后的深入学习中,卡在一个地方无法突破。

以上就是 反射机制 和 properties文件的联合使用 的最最最最最 简单的一种过程展示了
若对这篇博文有任何疑问或者意见以及建议,请在下方评论区提出,本人将尽早予以讲解以及答复,喜欢的同学请留下你们的赞,谢谢!!!

有关反射机制的全部内容,请观看本人的同专栏博文——《详解 反射机制》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值