JBeanClass

Java反射与JBean属性操作
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

/**
 * @author tl
 * @version [版本号, 2010-11-4]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class JBeanClass
{
	// 所支持的类型
	private static List<String> supportType = new ArrayList<String>();

	private static final int FIX_NUMBER2 = 2;

	private static final int FIX_NUMBER3 = 3;

	private static final int FIX_NUMBER4 = 4;

	static
	{
		supportType.add("byte");
		supportType.add("java.lang.Byte");
		supportType.add("short");
		supportType.add("java.lang.Short");
		supportType.add("int");
		supportType.add("java.lang.Integer");
		supportType.add("long");
		supportType.add("java.lang.Long");
		supportType.add("java.lang.BigInteger");
		supportType.add("float");
		supportType.add("java.lang.Float");
		supportType.add("double");
		supportType.add("java.lang.Double");
		supportType.add("char");
		supportType.add("boolean");
		supportType.add("java.lang.Boolean");
		supportType.add("java.lang.String");
		supportType.add("java.lang.Character");
	}

	/**
	 * 添加方法说明
	 */
	public JBeanClass()
	{
	}

	/**
	 * 根据对象获取对象所有属性
	 * @param entityName
	 * @return
	 * @throws Exception
	 */
	public static Field[] getProperts(Object entityName) throws Exception
	{
		Field field[] = entityName.getClass().getDeclaredFields();
		StringBuffer sb = new StringBuffer();
		for (Field f : field)
		{
			sb.append(f.getName()).append(" : ").append(getGetterMethodInvokeValue(entityName, f.getName())).append("\n");
		}
		Log.getLogger().info("getPropertyString : " + sb.toString());
		return field;
	}

	/**
	 * 获取getter方法的执行结果
	 * @param entity 方法所属的实体
	 * @param methodName 要执行的方法名
	 * @return 执行结果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static Object getGetterMethodInvokeValue(Object entity, String methodName)
	{
		methodName = "get" + CommonTools.createFirstCharToUpperCase(methodName);
		return getMethodInvokeValue(entity, methodName, null, null);
	}

	/**
	 * 获取方法的执行结果
	 * @param entity 方法所属的实体
	 * @param methodName 要执行的方法名
	 * @return 执行结果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static Object getMethodInvokeValue(Object entity, String methodName, Class[] paramType, Object[] paramValue)
	{
		try
		{
			Class c = entity.getClass();
			Method method = c.getMethod(methodName, paramType);
			return method.invoke(entity, paramValue);
		}
		catch (Exception e)
		{
			Log.getLogger().error("can't find method " + methodName + " in " + entity, e);
		}
		return null;
	}

	/**
	 * 从getter方法名称中获取属性的名称
	 * @param methodName 方法名称
	 * @return String 方法对应的属性名
	 */
	public static String getPropertyName(String methodName)
	{
		String propertyName = null;
		// 截取方法名"get"字符串后的所有字符 将获取的字符串首字母小写作为返回的属性名称
		if (methodName.length() > FIX_NUMBER3)
		{
			propertyName = methodName.substring(FIX_NUMBER3, FIX_NUMBER4).toLowerCase(Locale.ENGLISH) + methodName.substring(FIX_NUMBER4);
		}
		return propertyName;
	}

	/**
	 * 获取方法对象的返回值类型
	 * @param method 方法对象
	 * @return String 方法对象的返回值的类型
	 */
	public static String getMethodReturnType(Method method)
	{
		String type = null;
		if (method != null && method.getReturnType() != null)
		{
			type = method.getReturnType().getName();
		}
		return type;
	}

	/**
	 * 获取Set方法对象的第一个参数的类型
	 * @param method 方法对象
	 * @return String 方法对象的第一个参数的类型
	 */
	public static String getSetterMethodFirstParameterType(Method method)
	{
		String type = null;
		if (method != null && method.getParameterTypes().length >= 1)
		{
			type = method.getParameterTypes()[0].getName();
		}
		return type;
	}

	/**
	 * 设置对象指定名称的参数值
	 * @param entity 要操作的对象
	 * @param propertyName 属性名
	 * @param value 要设置的属性值
	 * @return Object 设置后的对象
	 * @throws java.lang.Exception Exception异常
	 */
	@SuppressWarnings("unchecked")
	public static Object setPropertyValueFromString(Object entity, String propertyName, String value) throws Exception
	{
		// 检查参数的有效性
		if ((null == entity) || (null == propertyName) || propertyName.equals("") || (null == value) || value.equals(""))
		{
			return entity;
		}

		propertyName = "set" + CommonTools.createFirstCharToUpperCase(propertyName);
		Method method = getMethod(entity, propertyName);
		if (null == method)
		{
			Log.getLogger().error("can't find method " + propertyName + " in " + entity, null);
		}

		String paramType = getSetterMethodFirstParameterType(method);

		// 复杂度太高,拆分成二个函数
		Object[] params = createParamsNumType(paramType, value);
		if (null == params)
		{
			params = createParamsOther(paramType, value);
		}
		if (params != null)
		{
			method.invoke(entity, params);
		}
		else
		{
			Log.getLogger().error("setPropertyValueFromString parametertype(" + paramType + "," + value + ")not supported。", null);
		}
		return entity;
	}

	/**
	 * 根据方法名获取方法 如果有多个同名的方法,函数只会随机取一个返回
	 * @param obj 要获取方法所在的类
	 * @param methodName 方法的名字
	 * @return 对应的方法
	 */
	public static Method getMethod(Object obj, String methodName)
	{
		Method[] methods = obj.getClass().getMethods();
		// 遍历所有的方法对象,获取所有的符合标准JAVA BEANS规范的setter方法对象集合
		for (int i = 0; i < methods.length; i++)
		{
			if (methods[i].getName().equals(methodName))
			{
				return methods[i];
			}
		}
		return null;
	}

	/**
	 * 根据参数类型和参数值,将参数值转换成指定类型的数据返回
	 * @param paramType
	 * @param value
	 * @return
	 */
	private static Object[] createParamsNumType(String paramType, String value)
	{
		Object[] params = null;
		if (paramType.equals("java.lang.Byte") || paramType.equals("byte"))
		{
			String ss = value;
			if (ss.length() <= FIX_NUMBER2)
			{
				params = new Byte[1];
				params[0] = Byte.valueOf(ss);
			}
		}
		else if (paramType.equals("java.lang.Short") || paramType.equals("short"))
		{
			params = new Short[1];
			params[0] = Short.valueOf(value);
		}
		else if (paramType.equals("java.lang.Integer") || paramType.equals("int"))
		{
			params = new Integer[1];
			params[0] = Integer.valueOf(value);
		}
		else if (paramType.equals("java.lang.Long") || paramType.equals("long"))
		{
			params = new Long[1];
			params[0] = Long.valueOf(value);
		}
		else if (paramType.equals("java.lang.Float") || paramType.equals("float"))
		{
			params = new Float[1];
			params[0] = Float.valueOf(value);
		}
		else if (paramType.equals("java.lang.Double") || paramType.equals("double"))
		{
			params = new Double[1];
			params[0] = Double.valueOf(value);
		}
		return params;
	}

	/**
	 * 根据参数类型和参数值,将参数值转换成指定类型的数据返回
	 * @param paramType
	 * @param value
	 * @return
	 */
	private static Object[] createParamsOther(String paramType, String value)
	{
		Object[] params = null;
		if (paramType.equals("java.lang.String"))
		{
			params = new String[1];
			params[0] = value;
		}
		else if (paramType.equals("java.lang.Character") || paramType.equals("char"))
		{
			String ss = value;
			if (ss.length() == 1)
			{
				params = new Character[1];
				params[0] = Character.valueOf(ss.charAt(0));
			}
		}
		else if (paramType.equals("java.lang.Boolean") || paramType.equals("bool"))
		{
			params = new Boolean[1];
			params[0] = Boolean.valueOf(value);
		}
		return params;
	}
}

 

提供了一个基于51单片机的RFID门禁系统的完整资源文件,包括PCB图、原理图、论文以及源程序。该系统设计由单片机、RFID-RC522频射卡模块、LCD显示、灯控电路、蜂鸣器报警电路、存储模块和按键组成。系统支持通过密码和刷卡两种方式进行门禁控制,灯亮表示开门成功,蜂鸣器响表示开门失败。 资源内容 PCB图:包含系统的PCB设计图,方便用户进行硬件电路的制作和调试。 原理图:详细展示了系统的电路连接和模块布局,帮助用户理解系统的工作原理。 论文:提供了系统的详细设计思路、实现方法以及测试结果,适合学习和研究使用。 源程序:包含系统的全部源代码,用户可以根据需要进行修改和优化。 系统功能 刷卡开门:用户可以通过刷RFID卡进行门禁控制,系统会自动识别卡片并判断是否允许开门。 密码开门:用户可以通过输入预设密码进行门禁控制,系统会验证密码的正确性。 状态显示:系统通过LCD显示屏显示当前状态,如刷卡成功、密码错误等。 灯光提示:灯亮表示开门成功,灯灭表示开门失败或未操作。 蜂鸣器报警:当刷卡或密码输入错误时,蜂鸣器会发出报警声,提示用户操作失败。 适用人群 电子工程、自动化等相关专业的学生和研究人员。 对单片机和RFID技术感兴趣的爱好者。 需要开发类似门禁系统的工程师和开发者。
此项目旨在实现一个简易而实用的RFID智能门禁控制系统。采用经典的51系列单片机——STC89C52作为核心控制器,集成MFRC522射频识别模块来读取RFID卡片信息。用户界面通过128x64像素的LCD显示屏展示相关信息,同时配备了键盘用于密码的输入、验证及修改。此设计结合了RFID技术的高效率识别与单片机的强大控制能力,适用于学习、教学或小型安防项目。 资源包含 源代码:完整C语言编写的源程序,涵盖了RFID识别、密码验证逻辑、显示控制以及用户交互等功能模块。 原理图:详细展示了整个系统的电路连接,包括单片机、MFRC522模块、LCD12864屏幕、按键等组件的电气连接方式,便于理解和自制。 技术特点 RFID技术应用:通过MFRC522模块实现非接触式身份认证,提升门禁安全性与便捷性。 人机交互界面:利用LCD12864显示屏直观展示状态信息,并通过物理按键进行操作,增加了系统的易用性。 密码安全机制:支持用户密码的设定和更改,增强系统安全性。 51单片机编程:适合初学者和专业人士学习51单片机应用开发,尤其是嵌入式系统与物联网领域的实践。 使用指南 环境搭建:确保你有合适的IDE(如Keil uVision)安装以编译51单片机的C代码。 原理图分析:详细阅读原理图,了解各部件间的连接,这对于正确搭建硬件平台至关重要。 编译与上传:将提供的源代码编译无误后,通过编程器或ISP接口烧录到STC89C52单片机中。 硬件组装:根据原理图搭建电路,确保所有组件正确连接。 测试与调试:完成后进行功能测试,可能需要对代码或硬件做适当调整以达到最佳工作状态。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值