利用JAVA反射机制 加载配置 (省去赋值的工作量)

首先是模板类的父类 在这里进行赋值 加载等相关操作 ↓

package door.fight;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;

@SuppressWarnings("unchecked")
public abstract class GameData extends HObject implements Cloneable
{
	/**
	 * 设置对象的值
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public boolean setValue(String key, String value)
	{
		try
		{
			if (value.length() == 0)
				value = "-1";
			Field field = getClass().getField(key);
			Class<?> class1 = field.getType();
			if (class1 == Integer.TYPE)
				field.setInt(this, Integer.parseInt(value));
			else if (class1 == Integer.class)
				field.set(this, (Integer) Integer.valueOf(value));
			else if (class1 == Long.TYPE)
				field.setLong(this, Long.parseLong(value));
			else if (class1 == Long.class)
				field.set(this, Long.valueOf(value));
			else if (class1 == Boolean.TYPE)
				field.setBoolean(this, Boolean.getBoolean(value));
			else if (class1 == Boolean.class)
				field.set(this, Boolean.valueOf(value));
			else if (class1 == Float.TYPE)
				field.setFloat(this, Float.valueOf(value).floatValue());
			else if (class1 == Float.class)
				field.set(this, Float.valueOf(value));
			else if (class1 == Double.TYPE)
				field.setDouble(this, Double.valueOf(value).doubleValue());
			else if (class1 == Double.class)
				field.set(this, Double.valueOf(value));
			else if (class1 == (java.lang.String.class))
				field.set(this, value);
			else if (class1 == Date.class)
			{
				SimpleDateFormat sdf = new SimpleDateFormat(
						"yyyy-MM-dd hh:mm:ss");
				try
				{
					field.set(this, sdf.parse(value));
				}
				catch (IllegalArgumentException e)
				{
					e.printStackTrace();
				}
				catch (ParseException e)
				{
					e.printStackTrace();
				}
			}
			return true;
		}
		catch (NoSuchFieldException nosuchfieldexception)
		{
			nosuchfieldexception.printStackTrace();
		}
		catch (SecurityException securityexception)
		{
			securityexception.printStackTrace();
		}
		catch (IllegalAccessException illegalaccessexception)
		{
			illegalaccessexception.printStackTrace();
		}
		return false;
	}

	/**
	 * 初始化多个对象
	 * 
	 * @param s
	 * @param GameDataClass
	 * @param arraylist
	 */
	public static final void initObjects(String s,
			Class<? extends GameData> GameDataClass,
			ArrayList<GameData> arraylist)
	{
		String as[] = s.split("\r\n");
		String as1[] = as[1].split("\t");
		for (int i = 2; i < as.length; i++)
		{
			if (as[i].length() < 1 && i < as.length - 1)
			{
				System.err.println(GameDataClass.getSimpleName()
						+ " read the configuration file data "
						+ "failed on line " + (i + 1)
						+ ", because the file does "
						+ "not match the number of data and the "
						+ "number of columms");
				continue;
			}
			String as2[] = as[i].split("\t");
			if (as2.length < 1 || null == as2[0] || as2[0].equals(""))
			{
				System.err.println(GameDataClass.getSimpleName()
						+ " read the configuration file data "
						+ "failed on line " + (i + 1)
						+ ", because this line of data or "
						+ "incomplete data length of zero");
				continue;
			}
			GameData gameobject = null;
			try
			{
				gameobject = GameDataClass.newInstance();
			}
			catch (IllegalAccessException illegalaccessexception)
			{
				illegalaccessexception.printStackTrace();
			}
			catch (InstantiationException instantiationexception)
			{
				instantiationexception.printStackTrace();
			}
			if (gameobject == null)
				break;
			initObject(gameobject, as1, as2);
			arraylist.add(gameobject);
		}
	}

	/**
	 * 初始化单个对象的值
	 * 
	 * @param gameobject
	 * @param as
	 *            属性
	 * @param as1
	 *            值
	 * 
	 */
	public static void initObject(GameData gameobject, String as[],
			String as1[])
	{
		for (int i = 0; i < as1.length; i++)
			if (as1[i].length() > 0)
			{
				if (as1[i].length() > 2 && as1[i].charAt(0) == '"'
						&& as1[i].charAt(as1[i].length() - 1) == '"')
					as1[i] = as1[i].substring(1, as1[i].length() - 1);
				gameobject.setValue(new String(as[i]), new String(as1[i]));
			}
	}

	/** 复制对象 */
	public Object clone()
	{
		GameData gameData = null;
		try
		{
			gameData = (GameData) super.clone();
		}
		catch (CloneNotSupportedException e)
		{
			e.printStackTrace();
		}
		return gameData;
	}

	public static void initObject(GameData gameobject, ArrayList<String> s)
	{
		for (int i = 0; i < s.size(); i++)
		{
			String[] attris = s.get(i).split("=");
			gameobject.setValue(attris[0], attris[1]);
		}
	}

	/**
	 * 初始化一个模型对象
	 */
	public static Object loadObject(GameData o, Map<String, String> scrAttrs)
	{
		Class<? extends GameData> clazz = o.getClass();
		while (clazz != GameData.class)
		{
			Field[] fields = clazz.getDeclaredFields();
			for (int i = 0; i < fields.length; i++)
			{
				Field field = fields[i];
				// 字段可访问性
				boolean accessFlag = field.isAccessible();
				// 字段可访问性为true
				field.setAccessible(true);
				// 字段名字
				String varName = field.getName();
				if (null != scrAttrs.get(varName))
				{
					o.setValue(varName, scrAttrs.get(varName).trim());
					// 字段类型
					// String type = field.getGenericType().toString();
					// // 字段值
					// String value = scrAttrs.get(varName).trim();
					// try
					// {
					// // 设置值,暂时用到int,java.lang.String,long,double
					// if (value!=null&&value.length()>0)
					// {
					//
					// if (type.equals("int"))
					// field.set(o, Integer.parseInt(value));
					// else if (type.equals("class java.lang.String"))
					// field.set(o, new String(value));
					// else if (type.equals("long"))
					// field.set(o, Long.parseLong(value));
					// else if (type.equals("double"))
					// field.set(o, Double.parseDouble(value));
					// }
					// }
					// catch (IllegalAccessException e)
					// {
					// e.printStackTrace();
					// }
				}
				// 恢复该字段可访问性
				field.setAccessible(accessFlag);
			}
			// 获取父类Class
			clazz = (Class<GameData>) clazz.getSuperclass();
		}
		return o;
	}

	/** 根据物品属性明得到属性索引index */
	public static int getIndex(String indexName, String[] arry)
	{
		for (int i = 0; i < arry.length; i++)
		{
			if (arry[i].equalsIgnoreCase((indexName)))
			{
				return i;
			}
		}
		return -1;
	}
}

子类模板内容 保证变量名和配置表中的字段一致 ↓

package door.model;

import door.fight.GameData;

/**
 * 机器人模板
 */
public class RobotModel extends GameData
{
	/** 名次 */
	public String MingCiMax = null;

	public String xgID = null;

	public int XXnumber = 0;

	public String LvFW = null;

	public double addGongXX = 0.0d;

	public double fyXX = 0.0d;

	public double bloodXX = 0.0d;

	public double speedXX = 0.0d;

	public double mzXX = 0.0d;

	public double sbXX = 0.0d;

	public double bjXX = 0.0d;

	public double bkXX = 0.0d;

	public String BOSSID = null;

	public int BS_number = 0;

	public String LvFWB = null;

	public double addGongBX = 0.0d;

	public double fyBX = 0.0d;

	public double bloodBX = 0.0d;

	public double speedBX = 0.0d;

	public double mzBX = 0.0d;

	public double sbBX = 0.0d;

	public double bjBX = 0.0d;

	public double bkBX = 0.0d;

	public void init()
	{

	}

	public String getMingCiMax()
	{
		return MingCiMax;
	}

	public String getXgID()
	{
		return xgID;
	}

	public int getXXnumber()
	{
		return XXnumber;
	}

	public String getLvFW()
	{
		return LvFW;
	}

	public double getAddGongXX()
	{
		return addGongXX;
	}

	public double getFyXX()
	{
		return fyXX;
	}

	public double getBloodXX()
	{
		return bloodXX;
	}

	public double getSpeedXX()
	{
		return speedXX;
	}

	public double getMzXX()
	{
		return mzXX;
	}

	public double getSbXX()
	{
		return sbXX;
	}

	public double getBjXX()
	{
		return bjXX;
	}

	public double getBkXX()
	{
		return bkXX;
	}

	public String getBOSSID()
	{
		return BOSSID;
	}

	public int getBS_number()
	{
		return BS_number;
	}

	public String getLvFWB()
	{
		return LvFWB;
	}

	public double getAddGongBX()
	{
		return addGongBX;
	}

	public double getFyBX()
	{
		return fyBX;
	}

	public double getBloodBX()
	{
		return bloodBX;
	}

	public double getSpeedBX()
	{
		return speedBX;
	}

	public double getMzBX()
	{
		return mzBX;
	}

	public double getSbBX()
	{
		return sbBX;
	}

	public double getBjBX()
	{
		return bjBX;
	}

	public double getBkBX()
	{
		return bkBX;
	}
}

最后 在启动时加载 ↓

	/** 加载机器人模板 */
	public static void loadRobotModel(String[] arg)
	{
		String[] indexs = StringKit.split(arg[1], "|");
		Map temp = null;
		RobotModel rbm = null;
		for (int i = 2; i < arg.length; i++)
		{
			String str = arg[i];
			if (str.equals(""))
			{
				continue;
			}
			String[] arry = StringKit.split(str, "|");
			temp = new HashMap();
			for (int j = 0; j < indexs.length; j++)
			{
				temp.put(indexs[j], arry[j]);
			}
			rbm = new RobotModel();
			GameData.loadObject(rbm, temp);
			rbm.init();
		}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值