javaproperties赋值_⾃动将properties属性赋值到类中的静态
变量
最近写了⼀个开源github项⽬,是⼀个纯Java项⽬,⽤来检测指定的⼀个服务器是否正常运⾏可访问。如果发⽣异常可以发送邮件,并可能的话可以尝试重启tomcat服务器。如果您感兴趣可以访问 serverfly 谢谢⼤家,安利完毕
现在开始正式介绍本⽂章,因为写这个⾃动反序列化properteis⼯具也是因为上⾯这个项⽬我才编写了这个⼯具类。可能这个项⽬⾥⾯也就这个⼯具类写的最多吧。
overflow在html中什么意思例如:config.properties中:
key1=123
key2=中⽂
key3=false
valid integer value什么意思Const.java:
毕业设计个人网页模板htmlpublic static int key1;
public static String key2;properties是什么文件
public static boolean key3;
使⽤⼯具类:
PropertiesAutoSerialize.init("/config.properties",Const.class);
看上去使⽤⽅式好像很简单,其实是真的很简单!这是真的!
实现原理
从properties⽂件中获取所有的key
遍历这些key去类中的同名静态字段
字段仅⽀持boolean,byte,char,short,int,long,float,double,String
properties需要使⽤UTF-8编码,否则中⽂乱码
献上⼯具类代码:PropertiesAutoSerialize.java
package com.againfly.util;
import java.io.*;
import flect.Field;
import flect.Modifier;
import java.util.Iterator;
import java.util.Properties;
/**
* Created by wangankang on 16/8/28.
* 该类⽤于将Properties⽂件中的参数,⾃动的设置到类同名字段中,前提是字段为静态的.
*/
public class PropertiesAutoSerialize implements Serializable {
* 待反序列化的类
*/
private Class clazz;
/**
* 待反序列化的Properties⽂件输⼊流
*/
private InputStream propertiesFile;
/**
* Properties操作对象
表单大师免费版限制*/
private Properties p = new Properties();
/**
* 私有的构造⽅法
* ⽤于获取Properties⽂件流和设置待转对象
*
* @param path ⽤于指定Properties⽂件路径,例如"/config.properties"
* @param clazz 待反序列化的类
*/
private PropertiesAutoSerialize(String path, Class clazz) {
this.propertiesFile = ResourceAsStream(path); InputStreamReader isr = null;
try {
isr = new InputStreamReader(propertiesFile, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
this.clazz = clazz;
try {
p.load(isr);
} catch (IOException e) {
e.printStackTrace();
}
}
* 获取指定key的value值
*
* @param key ⽤于指定获取Properties中的key
* @return ⽤于返回Properties中指定key的value
*/
private String readProperty(String key) {
if (null == key || "".im())) return null;
Property(key);
}
/**
* PropertiesAutoSerialize.init("/config.properties",Const.class); *
* @param path properties路径名
* @param clazz 需要反序列化的类
*/
public static void init(String path, Class clazz) {
new PropertiesAutoSerialize(path, clazz).serializeProperties(); }
/**
* 转换实现原理:
* 获取Properties中所有的key,并遍历
* 获取该key对应的value,如果value为空字符串,则跳过
* 去取待转类中的同名字段,如果没有则跳过
* 判断这个字段是否是静态字段,如果不是则跳过
* 判断这个字段是否是final,如果是则跳过
* 设置该字段为可见
* 获取Properties中指定的value并trim
* 执⾏setField⽅法,对指定的字段进⾏设置值
*/
private void serializeProperties() {
try {
Iterator iterator = p.keySet().iterator();
while (iterator.hasNext()) {
Object obj = ();
if (!(obj instanceof String)) {
continue;
}
String key = ((String) obj).trim();
String value = readProperty(key).trim();
if (StringUtil.isEmpty(value)) {
continue;
}
Field field;
if (null == (field = getField(key))) {
continue;
}
if (!Modifier.Modifiers())) {
continue;
}
if (Modifier.Modifiers())) {
continue;
}
field.setAccessible(true);
this.setField(field, value);
}
} finally {
try {
if (null != propertiesFile)
propertiesFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 通过反射获取待转类clazz中指定字段名的字段,如果字段不存在则返回null *
* @param fieldName 去查待转类中的指定字段
面试谈谈对spring的理解* @return 返回指定的字段
*/
private Field getField(String fieldName) {
try {
DeclaredField(fieldName);
} catch (Exception ignored) {
}
return null;
}
/**
* 对指定的字段进⾏设置值,⽬前仅⽀持字段类型:
* String,boolean,byte,char,short,int,long,float,double
*
* @param field 指定的字段
* @param value 设置值
*/
private void setField(Field field, String value) {
Class type = Type();
Object par = null;
try {
if (String.class.Type())) {
par = value;
} else if (int.class.equals(type) || Integer.class.equals(type)) {
par = Integer.valueOf(value);
} else if (boolean.class.equals(type) || Boolean.class.equals(type)) { par = Boolean.valueOf(value);
} else if (long.class.equals(type) || Long.class.equals(type)) {
par = Long.valueOf(value);
} else if (double.class.equals(type) || Double.class.equals(type)) { par = Double.valueOf(value);
} else if (float.class.equals(type) || Float.class.equals(type)) {
par = Float.valueOf(value);
} else if (short.class.equals(type) || Short.class.equals(type)) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论