在本专题《详解 反射机制》之前的博文中,本人将所有有关 反射机制的基本使用方式都讲解完了,但是,为什么本人还要用一片博文来展示 反射机制 和 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文件的联合使用 的最最最最最 简单的一种过程展示了
若对这篇博文有任何疑问或者意见以及建议,请在下方评论区提出,本人将尽早予以讲解以及答复,喜欢的同学请留下你们的赞,谢谢!!!
有关反射机制的全部内容,请观看本人的同专栏博文——《详解 反射机制》