@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

相關文章
相關標籤/搜索