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


标题中提及的“BOE-B2-154-240-JD9851-Gamma2.2_190903.rar”标识了一款由京东方公司生产的液晶显示单元,属于B2产品线,物理规格为154毫米乘以240毫米,适配于JD9851型号设备,并采用Gamma2.2标准进行色彩校正,文档生成日期为2019年9月3日。该压缩文件内包含的代码资源主要涉及液晶模块的底层控制程序,采用C/C++语言编写,用于管理显示屏的基础运行功能。 液晶模块驱动作为嵌入式系统的核心软件组成部分,承担着直接操控显示硬件的任务,其关键作用在于通过寄存器读写机制来调整屏幕的各项视觉参数,包括亮度、对比度及色彩表现,同时负责屏幕的启动与关闭流程。在C/C++环境下开发此类驱动需掌握若干关键技术要素: 首先,硬件寄存器的访问依赖于输入输出操作,常借助内存映射技术实现,例如在Linux平台使用`mmap()`函数将寄存器地址映射至用户内存空间,进而通过指针进行直接操控。 其次,驱动需处理可能产生的中断信号,如帧缓冲区更新完成事件,因此需注册相应的中断服务例程以实时响应硬件事件。 第三,为确保多线程或进程环境下共享资源(如寄存器)的安全访问,必须引入互斥锁、信号量等同步机制来避免数据竞争。 第四,在基于设备树的嵌入式Linux系统中,驱动需依据设备树节点中定义的硬件配置信息完成初始化与参数设置。 第五,帧缓冲区的管理至关重要,驱动需维护该内存区域,保证图像数据准确写入并及时刷新至显示面板。 第六,为优化能耗,驱动应集成电源管理功能,通过寄存器控制实现屏幕的休眠与唤醒状态切换。 第七,针对不同显示设备支持的色彩格式差异,驱动可能需执行色彩空间转换运算以适配目标设备的色彩输出要求。 第八,驱动开发需熟悉液晶显示控制器与主处理器间的通信接口协议,如SPI、I2C或LVDS等串行或并行传输标准。 最后,完成代码编写后需进行系统化验证,包括基础显示功能测试、性能评估及异常处理能力检验,确保驱动稳定可靠。 该源代码集合为深入理解液晶显示控制原理及底层驱动开发实践提供了重要参考,通过剖析代码结构可掌握硬件驱动设计的具体方法与技术细节。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值