JBeanClass

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;
	}
}

 

资源下载链接为: https://pan.quark.cn/s/d3128e15f681 罗技MX Master 2S是一款高端无线鼠标,凭借其卓越的性能和舒适性,深受专业设计师、程序员以及需要长时间使用鼠标的人群的喜爱。它在macOS平台上表现出色,功能丰富。而“LogiMgr Installer 8.20.233.zip”是该鼠标在macOS系统上对应的软件安装程序,版本号为8.20.233,主要功能如下: 驱动安装:该安装包可确保MX Master 2S在macOS系统中被正确识别和配置,发挥出最佳硬件性能,同时保证良好的兼容性。它会安装必要的驱动程序,从而启用鼠标的高级功能。 自定义设置:借助此软件,用户能够根据自己的工作习惯,对MX Master 2S的各个按钮和滚轮功能进行自定义。比如设置特定快捷键、调整滚动速度和方向等,以满足个性化需求。 Flow功能:罗技Flow是一项创新技术,允许用户在多台设备间无缝切换。只需在软件中完成设备配置,鼠标就能在不同电脑之间进行复制、粘贴操作,从而大幅提升工作效率。 电池管理:软件具备电池状态监控功能,可帮助用户实时了解MX Master 2S的电量情况,并及时提醒用户充电,避免因电量不足而影响工作。 手势控制:MX Master 2S配备独特的侧边滚轮和拇指按钮,用户可通过软件定义这些手势,实现诸如浏览页面、切换应用等操作,进一步提升使用便捷性。 兼容性优化:罗技的软件会定期更新,以适应macOS系统的最新变化,确保软件与操作系统始终保持良好的兼容性,保障鼠标在不同系统版本下都能稳定运行。 设备配对:对于拥有多个罗技设备的用户,该软件能够方便地管理和配对这些设备,实现快速切换,满足多设备使用场景下的需求。 在安装“LogiMgr Installer 8.20.233.app”时,用户需确保macOS系统满足软件的最低要求,并
资源下载链接为: https://pan.quark.cn/s/27e1210fbf58 《RT-Thread在STM32F103C8T6上的移植实战指南》 RT-Thread是一款开源、轻量级且高可扩展性的实时操作系统(RTOS),广泛应用于物联网、工业控制和消费电子等领域。STM32F103C8T6作为一款基于ARM Cortex-M3内核的微控制器,凭借其丰富的外设资源和高性价比,成为嵌入式系统学习与开发的理想平台。本文将详细介绍如何将RT-Thread移植到STM32F103C8T6,并逐步添加rt_printf支持和Finsh组件,以实现调试与交互功能。 一、移植准备 移植RT-Thread到STM32F103C8T6的第一步是下载RT-Thread Nano的源码,具体操作方法在2.下载RT-Thread Nano源码中详细说明。RT-Thread Nano是RT-Thread的精简版,专为资源受限的嵌入式设备设计。 二、整合源码 将下载的RT-Thread Nano源码复制到STM32的裸机工程中,相关步骤在3.拷贝RT-Thread Nano源码到裸机工程中介绍。需确保源码结构与工程匹配,以便后续编译和配置。 三、调整工程目录结构 为适应STM32开发环境,需对工程目录结构进行调整。5.修改工程目录结构中详细说明了如何组织和调整文件,确保编译器正确识别和处理所有源文件。 四、删除未使用的文件 为优化内存占用,需删除RT-Thread中不必要的文件。4.删除RT-Thread中不必要的文件中列出了可安全移除的文件清单。 五、编译与错误修复 完成目录结构调整和冗余文件删除后,开始编译工程。在6.编译工程并修复错误中,将逐一解决编译过程中的错误和警告,确保代码无误。 六、配置Board.c文件 8.修改board.c文件涉及针对STM32F103C8T6硬件特性的
资源下载链接为: https://pan.quark.cn/s/d3128e15f681 《支付宝私域运营白皮书(2021)》深入剖析了支付宝在数字化生活服务领域的发展态势以及商家如何借助支付宝平台开展私域运营的策略与实践。以下是其核心要点: 支付宝生态演变:支付宝不再局限于支付功能,而是发展为一个涵盖生活缴费、社保公积金、出行、医疗健康等众多领域的开放型数字生活服务平台,成为消费者获取线上线下服务的关键入口。目前,用户可在支付宝上办理超1000项服务。 消费者行为分析:支付宝用户的搜索行为多集中于打车、点餐、快递、租车等高频服务,线下扫码服务(如骑车、点餐、购物等)的用户心智也日益成熟。餐饮、快消零售、家政服务、酒店旅游等行业商家在支付宝上的布局尤为活跃。 支付宝小程序分布:餐饮行业的小程序数量占比最高,快消零售、家政服务和酒店旅游紧随其后。这些行业的商家在支付宝的交易量也较为可观,如餐饮、缴费还款、交通出行、教育、共享租赁等领域。 私域运营路径:支付宝构建了一套完整的私域运营链路,涵盖公域获客(如搜索、首页推荐、营销会场)、用户留存(如“生活号+”关注、小程序收藏)、复访与召回(如消息订阅、会员频道)、用户分析(如访问分析、留存分析、分析营销)等环节。商家可通过线下物料引导、支付成功页推广、城市区域投放等方式与用户建立连接。 会员运营策略:商家可在支付宝平台上运营会员,通过消息触达、内容营销等手段提升用户粘性,促进复购。卡包功能、会员频道、支付后营销等结合优惠券策略,可有效实现用户留存与召回。 案例分享:白皮书中可能包含多个商家案例,展示其在支付宝私域运营中的成功实践,如如何运用“生活号+”营销、优惠券策略和会员管理等。 运营规范与指南:白皮书为商家提供了在支付宝平台开展私域运营的规则和操作指南,助力商家合规且高效地开展营销活动。 白皮书为商家提供了全面的策略指导,帮助
资源下载链接为: https://pan.quark.cn/s/6b3e936ec683 “四川90米DEM高程数据.zip”是一个包含四川省90米分辨率数字高程模型(DEM)数据的压缩文件。这种数据在地理信息系统(GIS)中用途广泛,可用于地形分析、环境研究、城市规划和灾害评估等,为这些领域提供地表高度信息。该数据的原始来源是SRTM3(航天飞机雷达地形测绘任务),这是NASA于2000年开展的项目,其数据具有3弧秒(约90米)的空间分辨率,是全球广泛使用的公开DEM数据源,可靠性高且覆盖范围广。数据经过严格裁剪,按照四川省的行政边界进行了精确切割,仅保留省内高程信息,便于用户针对特定区域进行分析,无需处理无关数据。裁剪所依据的行政区划范围参考了高德地图的数据,高德作为中国知名导航和地图服务提供商,其数据准确且更新及时。 压缩包中的“四川省90米DEM.tif”是一个TIFF格式的栅格图像文件,存储了四川省90米分辨率的高程值,每个像素代表一个地表点,其灰度值对应该点的海拔高度。此外,压缩包内还包含“90米、30米、12.5米和5米全国DEM下载教程.txt”,这是一份文本文件,详细介绍了获取不同分辨率全国DEM数据的方法和资源链接。不同分辨率的DEM数据适用于不同应用场景,例如5米分辨率数据适用于精细地形描绘项目,而90米分辨率数据则适用于宏观分析。总体而言,该压缩包提供了源自SRTM3、经过高德地图边界信息裁剪的四川省90米分辨率高程数据,同时附带的教程还能帮助用户获取更多不同分辨率的全国DEM数据,满足各类GIS项目需求。
资源下载链接为: https://pan.quark.cn/s/502b0f9d0e26 Visual AssistX是一款备受开发者青睐的Visual Studio插件,它在代码编辑、重构和导航方面表现出色,极大地提高了开发效率。随着Visual Studio 2022的推出,Visual AssistX也及时更新,完美支持这一最新版本,为程序员带来了更强大的开发体验。 Visual AssistX的核心功能之一是其智能感知能力。它能够提供自动补全、快速修复以及上下文相关的帮助,这大大减少了手动输入代码的时间,同时也降低了出错的可能性。此外,它的代码重构工具也非常实用,可以轻松完成诸如重命名、提取方法和移动函数等操作,让代码调整和优化变得简单高效。Visual AssistX还增强了代码导航功能,通过“转到定义”和“查找引用”等功能,使得在大型项目中查找和理解代码变得更加便捷。 对于使用Visual Studio 2022的用户来说,Visual AssistX的集成意味着他们可以在享受最新IDE性能提升的同时,充分利用插件带来的额外优势。Visual Studio 2022引入了64位支持,提升了内存管理能力,尤其在处理大型项目时表现更为出色。而Visual AssistX与之结合后,进一步优化了代码编写过程,尤其在处理大量代码或进行复杂调试时,效率提升显著。 然而,在安装过程中可能会遇到一些问题。例如,如果在运行Visual AssistX安装程序.exe时出现无响应的情况,这可能是由于系统兼容性问题引起的。为了解决这个问题,用户可以尝试将.exe文件的兼容模式设置为Windows 7。具体操作步骤是:右键点击.exe文件,选择“属性”,然后在“兼容性”选项卡中勾选“以兼容模式运行此程序”,并在下拉菜单中选择“Windows 7”。通常,这种方法可以解决大部分兼容性问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值