读取配置文件,利用反射给类属性赋值,

背景:项目中用的全局变量,一般通过形如 pubic static final String ABC="abc";然后在项目中用类.属性名的方式调用。

如果变量的值并不固定。比如不同客户定义的值不同,就不能用final修饰。只能用public static String ABC;方式来声明,也可加默认初始值;

这个时候我们就需要一个初始化方法(init())来对变量进行初始化赋值,让其变得有意义。

因为值需要从配置文件中读取,传统方法,可能是根据属性的set方法一个一个设置。假如有10个属性,可能有10段90%相似度的设置代码。 类似  r.setABC(value);

利用reflect(反射),可以自动完成这些工作,前提是:保证.properties文件中的key跟属性名保持一致(这样才能顺利读取到对应的值)

定义类:

public class R{
     public static String TOKEN="default-value";
     public static String APPID;
     ...
}

定义R.properties配置文件:

TOKEN=SDLKFJL
APPID=DFSLF
...

定义其中一个init()方法:

      /**
      * 初始化变量,通过读取properties文件
      */
      public  static void init(){
           System. out.println( "开始初始化");

            try {
                 //1读取配置文件
                 Class c=R. class;
//              InputStream in = Class.forName("com.wupl.constant.R").getResourceAsStream("src/R.properties");
                InputStream in = new BufferedInputStream( new FileInputStream("src/R.properties" ));
                Properties properties = new Properties();
                properties.load(in);

                 //通过反射获取所有string类型成员变量信息,并以此读取配置文件中的值并赋值。
                Field [] fields = c.getDeclaredFields();

                 for( int i=0;i<fields. length;i++){
                     Field field = fields[i];
                     String fieldName=field.getName();
                      //判断是否是字符串类型,配置文件中有对应的key=value键值
                      if(field.getGenericType().toString().equals( "class java.lang.String")&&
                           properties.containsKey( fieldName)){
                           String value=properties.getProperty(fieldName); //取值
                           System. out.println( "取到" +fieldName+ "--的值--" +value);
                           field.set( fieldName, value);

                     }
                }
                System. out.println( "初始化完毕" );

           } catch (Exception e) {

                System. out.println( "初始化失败" );
                e.printStackTrace();
           }
     }

方法原理很简单:利用反射获取R类里面所有的属性,得到 Field数组,遍历,因为配置文件中都是String类型值,所以判断:

如果属性是String 类型(通过field.getGenericType().toString().equals( "class java.lang.String") ),再判断配置文件中是否有对应的key=value值。

条件成立==》则取值,并赋值。

这样R类里面的所以String 类型的成员变量都会取到配置文件中对应的值(如果存在的话)。

而且如果以后增加属性,只需要保持配置文件中key值跟属性名相同,初始化不用修改一句代码。方便扩展。

时间: 2024-10-03 20:38:04

读取配置文件,利用反射给类属性赋值,的相关文章

Android利用反射机制为实体类属性赋值

在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面是在我在android中如何利用java反射机制给实体类赋值. 在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包 import java.lang.reflect.Field; import java.lang.reflect.Method; 给实体类赋值首先需要一个实体类,这

Java反射(二)利用反射分析类的能力

利用反射分析类能力的类的源码如下(来源于<Java核心技术>卷一): package testreflection; import java.util.*; import java.lang.reflect.*; /** * 这个类利用反射打印出一个类的所有特征 * * @version 1.1 2004-02-21 * @author Cay Horstmann */ public class ReflectionTest { public static void main(String[]

泛型约束和利用反射修改对象属性的值

周日了都,昨天休息了一天,今天想想得敲敲代码练习一下,如下关于泛型约束和利用反射修改对象属性的值的, 都挺简单的,呵呵,但时间一长,不经常使用还容易忘记在此就当记录一下了, 首先泛型代码一般是如下的情形: 加了泛型约束,只允许引用类型并且是只能是无参数的构造函数的类型才能传入,也就是不允许给类构造参数传递实参,否则将报错. 错误 1 “XXXXXX.pros”必须是具有公共的无参数构造函数的非抽象类型,才能用作泛型类型或方法“ 1 public static T GetObject<T>(T

利用反射更新类

#region 利用反射更新类 /// <summary> /// 利用反射更新类 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entity"></param> /// <param name="db"></param> public static void

C#利用反射获取对象属性值

public static string GetObjectPropertyValue<T>(T t, string propertyname){     Type type = typeof(T); PropertyInfo property = type.GetProperty(propertyname); if (property == null) return string.Empty; object o = property.GetValue(t, null); if (o == n

java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; import java.io.Serializable; public class Creature<T> implements Serializable { private char gender; public double weight; private void breath() { Syste

类属性赋值

public static T ConvertAndAssignment<T>(this object obj) where T : new() { T t = new T(); PropertyInfo[] propertys = obj.GetType().GetProperties(); foreach (PropertyInfo property in propertys) { var value = property.GetValue(obj, null); var property

用反射获取类属性值并且赋值

/** * * @projectname 项目名称: cms-interface * @packageclass 包及类名: com.jy.modules.utils.CreditUtil.java * @description 功能描述: Object 可以是任意对象在不确定对象的时候获取值设置值 * @author 作 者: zhouzhiwei * @param 参 数: @param Requestobj * @param 参 数: @param obj * @param 参 数: @r

利用反射实现类通用的DAO层

public void add(Object object) throws SQLException { ResultSet rs=null; PreparedStatement ps=null; Connection con=null; //获取表名 Class c= object.getClass(); String className=c.getName(); String declareName=className.substring(className.lastIndexOf(".&q