活不多说,亮出代码:
注解定义:
package org.sorpio.gen;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
// 此注解作用于字段上
@Target(ElementType.FIELD)
public @interface Value {
String value();
}
获取properties文件内容
package org.sorpio.gen.util;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
/**
* 获取properties文件的值
* @author Li Enbo
* @date 2017年11月22日下午1:44:28
*/
public class PropertiesUtils {
/**
* 获取properties文件的值
*
* @param key
* @return value
*/
public static String getValue(String key) {
String fileNamePath = "src/main/resources/config.properties";
Properties props = new Properties();
InputStream in = null;
try {
in = new FileInputStream(fileNamePath);
// prop.load(in); 直接这么写,如果properties文件中有中文汉字,则汉字会乱码。因为未设置编码格式。
props.load(new InputStreamReader(in, "utf-8"));
if (key == null || "".equals(key)) {
throw new NullPointerException("key值为空");
}
String value = props.getProperty(key);
return value;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (null != in)
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
为实例对象设值
package org.sorpio.gen.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Objects;
import org.sorpio.gen.Value;
/**
* 获取为对象设置的值工具类
*
* @author Li Enbo
* @date 2017年11月22日下午1:42:47
*/
public class ValueUtils {
/**
*
* @param obj
* @throws Exception
*/
public static void getValue(Object obj) throws Exception {
Class<?> clz = obj.getClass();
// 解析字段上是否有注解
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
boolean fieldHasAnno = field.isAnnotationPresent(Value.class);
if (fieldHasAnno) {
Value valueAnnoation = field.getAnnotation(Value.class);
// 获取注解的值
String value = valueAnnoation.value();
// 通过注解设置的值获取properties的值
String propertiedValue = Objects.requireNonNull(PropertiesUtils.getValue(value));
// 获取属性的名字
String name = field.getName();
// 将属性的首字符大写, 构造get,set方法
name = name.substring(0, 1).toUpperCase() + name.substring(1);
// 获取属性的类型
String type = field.getGenericType().toString();
// 如果type是类类型,则前面包含"class ",后面跟类名
// String 类型
if (type.equals("class java.lang.String")) {
Method m = clz.getMethod("set" + name, String.class);
// invoke方法传递实例对象,因为要对实例处理,而不是类
m.invoke(obj, propertiedValue);
}
// int Integer类型
if (type.equals("class java.lang.Integer")) {
Method m = clz.getMethod("set" + name, Integer.class);
m.invoke(obj, Integer.parseInt(propertiedValue));
}
if (type.equals("int")) {
Method m = clz.getMethod("set" + name, int.class);
m.invoke(obj, (int) Integer.parseInt(propertiedValue));
}
// boolean Boolean类型
if (type.equals("class java.lang.Boolean")) {
Method m = clz.getMethod("set" + name, Boolean.class);
if (propertiedValue.equalsIgnoreCase("true")) {
m.invoke(obj, true);
}
if (propertiedValue.equalsIgnoreCase("false")) {
m.invoke(obj, true);
}
}
if (type.equals("boolean")) {
Method m = clz.getMethod("set" + name, boolean.class);
if (propertiedValue.equalsIgnoreCase("true")) {
m.invoke(obj, true);
}
if (propertiedValue.equalsIgnoreCase("false")) {
m.invoke(obj, true);
}
}
// long Long 数据类型
if (type.equals("class java.lang.Long")) {
Method m = clz.getMethod("set" + name, Long.class);
m.invoke(obj, Long.parseLong(propertiedValue));
}
if (type.equals("long")) {
Method m = clz.getMethod("set" + name, long.class);
m.invoke(obj, Long.parseLong(propertiedValue));
}
// 时间数据类型
if (type.equals("class java.util.Date")) {
Method m = clz.getMethod("set" + name, java.util.Date.class);
m.invoke(obj, DataConverter.convert(propertiedValue));
}
}
}
}
}
时间格式转换器
package org.sorpio.gen.util;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DataConverter {
private static final List<String> formarts = new ArrayList<String>(4);
static {
formarts.add("yyyy-MM");
formarts.add("yyyy-MM-dd");
formarts.add("yyyy-MM-dd hh:mm");
formarts.add("yyyy-MM-dd hh:mm:ss");
}
public static Date convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
if (source.matches("^\\d{4}-\\d{1,2}$")) {
return parseDate(source, formarts.get(0));
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
return parseDate(source, formarts.get(1));
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
return parseDate(source, formarts.get(2));
} else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
return parseDate(source, formarts.get(3));
} else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
/**
* 功能描述:格式化日期
*
* @param dateStr
* String 字符型日期
* @param format
* String 格式
* @return Date 日期
*/
public static Date parseDate(String dateStr, String format) {
Date date = null;
try {
DateFormat dateFormat = new SimpleDateFormat(format);
date = (Date) dateFormat.parse(dateStr);
} catch (Exception e) {
}
return date;
}
}
properties文件
name=lien6o
age=24
addr=北京市海淀区
date=2016-11-11 12:6:20
User类
package org.sorpio.gen;
import java.util.Date;
/**
* <p>
* Title:User
* </p>
* <p>
* Description:
* </p>
* <p>
* Company:
* </p>
*
* @author Li Enbo
* @date 2017年11月22日上午9:12:03
*/
public class User {
@Value("name")
private String name;
@Value("age")
private int age;
@Value("addr")
private String addr;
@Value("date")
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", addr=" + addr + ", date=" + date + "]";
}
}
控制台