芜湖市公司网站建设哪家好,网站开发+百度编辑器,wordpress 修改dns打不开,进入公众号的欢迎语需求
对象的相关信息存储在javabean.properties文件中#xff0c;通过读取properties文件中的信息#xff0c;实例化对象#xff0c;要求程序不能硬编码#xff0c;即程序可以通用#xff0c;针对不同的对象#xff0c;都可以实例化。仅需修改配置文件#xff0c;不需要…需求
对象的相关信息存储在javabean.properties文件中通过读取properties文件中的信息实例化对象要求程序不能硬编码即程序可以通用针对不同的对象都可以实例化。仅需修改配置文件不需要更改代码。
实现代码
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Properties;/*** 实例化对象*/
public class AddInstance {public static void main(String[] args) throws Exception {// 读取本地javabean.propertiesProperties properties new Properties();properties.load(new FileReader(C:\\Users\\1\\IdeaProjects\\javaSE\\javabean.properties));// 根据javabean.properties中的className值获取对应的字节码对象Class className Class.forName((String) properties.get(className));// 获取构造器Constructor constructor className.getConstructor();// 获取实例化对象Object obj constructor.newInstance();// 获取所有的变量对象Field[] fields className.getDeclaredFields();// 遍历变量对象for (Field field : fields) {// 分割变量对象需要注意”.“需要转义String[] split (field.toString()).split(\\.);// 获取属性名String attribute split[split.length - 1];// 将属性的访问设置为truefield.setAccessible(true);// 定义Object对象Object o;// 如果该对象的某个属性是int类型if (field.getType() int.class) {// 将从javabean.properties中获取到的对应的该值转为Integer类型o Integer.parseInt((String) properties.get(attribute));} else {// 不是int类型直接将取出javabean.properties中的值o properties.get(attribute);}// 写入field.set(obj, o);}System.out.println(通过配置文件创建了对象,并赋值结果是: obj);}
}需要注意以下两点 1获取javaBean的属性对象后用“.”点进行分割时需要转义即“\\.”不然分割不出效果 System.out.println(------------------------------------------------------------);System.out.println(field.toString());String[] split (field.toString()).split(\\.);System.out.println(Arrays.toString(split));String[] split1 (field.toString()).split(.);System.out.println(Arrays.toString(split1));2因为从properties文件中读出来的值都是字符串的所以在写入对象值时需要判断即判断对象的该属性比如是int类型则把从properties中读取出来的该属性的值转为int类型 // 如果该对象的某个属性是int类型if (field.getType() int.class) {// 将从properties.properties中获取到的对应的该值转为Integer类型o Integer.parseInt((String) properties.get(attribute));} else {// 不是int类型直接将取出properties.properties中的值o properties.get(attribute);}总结和分析
通过反射和读取本地配置文件的方式来实例化对象看似避免了“硬编码”实例化不同对象不需要更改代码。但是仍有以下几点麻烦之处 1实例化不同的对象需要更改配置文件的className值即需要实例化javaBean的全类名 2另外如果javaBean属性中有非字符串类型的则需要增加判断 3而且如果多个javaBean的实例化信息存放在properties内不免会出现属性重复的情况。比如Person类有name属性User类也有name属性这时就需要创建多个properties文件不免有些麻烦。