Java 反射使用

package jtp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import jtp.annotation.UNParse;

public class JTP {

	public static String OP_J = "#";
	public static String OP_E = "=";

	public static <T> T parse(File file, Class<T> cls) {
		if (file == null || !file.exists() || file.isDirectory() || !file.canRead())
			return null;
		if (cls == null)
			return null;
		T newInstance = null;
		try {
			@SuppressWarnings("resource")
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
			if (reader != null) {
				String txt = null;
				// 所有的键值
				Map<String, String> map = null;
				while ((txt = reader.readLine()) != null) {
					// 如果有#号就不解析
					if (!txt.contains(OP_J)) {
						// 遇到=
						if (txt.contains(OP_E)) {
							txt = txt.trim();
							int indexOf = txt.indexOf(OP_E);
							if (indexOf != 1 && indexOf != -1) {
								// 检测后面是否还有值
								// 截取从找到的位置开始+OP_E的长度
								if (map == null) {
									map = new HashMap<String, String>();
								}
								String key = txt.substring(0, indexOf).trim();
								String value = txt.substring(indexOf + OP_E.length(), txt.length()).trim();
								if (value.length() > 0) {
									map.put(key, value);
								}
							}
						}
					}
				}
				if (map != null) {
					// 先创建这个对象
					newInstance = cls.newInstance();
					Field[] declaredFields = newInstance.getClass().getDeclaredFields();
					for (Field field : declaredFields) {
						if (!field.isAnnotationPresent(UNParse.class)) {
							// 取消访问检查
							field.setAccessible(true);
							String name = field.getName();
							if (map.containsKey(name)) {
								Class<?> type = field.getType();
								if (type.equals(String.class)) {
									field.set(newInstance, map.get(name));
								} else if (type.equals(int.class)) {
									field.set(newInstance, Integer.valueOf(map.get(name)));
								} else if (type.equals(double.class)) {
									field.set(newInstance, Double.valueOf(map.get(name)));
								} else if (type.equals(long.class)) {
									field.set(newInstance, Long.valueOf(map.get(name)));
								} else if (type.equals(float.class)) {
									field.set(newInstance, Float.valueOf(map.get(name)));
								} else if (type.equals(short.class)) {
									field.set(newInstance, Short.valueOf(map.get(name)));
								} else if (type.equals(boolean.class)) {
									field.set(newInstance, Boolean.valueOf(map.get(name)));
								}
							}
						}
					}
				}
			}

		} catch (UnsupportedEncodingException | FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return newInstance;
	}

}

package jtp.annotation;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ java.lang.annotation.ElementType.FIELD })
public @interface UNParse {
}


测试用到的类

package jtp.example;

import jtp.annotation.UNParse;

public class Person {
	
	@UNParse
	private String name;

	private int port;

	private String address;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

}
package jtp.example;

import java.io.File;

import jtp.JTP;

public class Main {

	public static void main(String[] args) {
		Person pls = JTP.parse(new File("server.ini"), Person.class);
		System.out.println(pls.getName());
		System.out.println(pls.getAddress());
		System.out.println(pls.getPort());
	}
}


输出:

null
null
8899


你可能感兴趣的:(java,java反射)