@Value注解的本身实现

活很少说,亮出代码:java

注解定义:ide

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();
				}
		}
	}
}

为实例对象设值 ui

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));
				}
			}
		}
	}

}

 时间格式转换器this

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类code

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 + "]";
	}
}

控制台orm

相关文章
相关标签/搜索