- 浏览: 522981 次
- 性别:
- 来自: 无锡
-
文章分类
最新评论
-
鬼一天:
代码有问题,没有考虑负数的情况。
根据经纬度和半径计算经纬度范围 -
Tair:
...
通过反射把map中的属性赋值到实体类bean对象中 -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
Spring3.0 MVC的初次尝试 -
酷的飞上天空:
haiyinlong 写道private File value ...
使用HttpUrlConnection进行post请求上传文件 -
lliiqiang:
分析很难,好的规则持久,靠某个方法条件局限不能证明长久
ruby的基本类型
使用过struts2后感觉最方便的就是这个框架能自动把表单的参数赋值到action里面的对象中
但现在主要使用Spring框架的MVC,虽然也有@ModelAttribute可以使用但是明显感觉不方便。
好吧,那就自己再造一个轮子吧。
原理都知道,就是利用反射进行字段的赋值,下面贴代码
主要类如下:
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class MapToEntryConvertUtils { private static Log log = LogFactory.getLog(MapToEntryConvertUtils.class); /** * 缓存类的属性信息 */ private static Map<String,ConvertEntryItem> convertItemCache = new HashMap<String,ConvertEntryItem>(); /** * Map转换为Entry * @param <T> * @param valueMap 泛型类型为<String,Object> * @param entityClass * @param prefix 从map中取值的key为 prefix + attr * @return */ @SuppressWarnings("rawtypes") public static <T> T convert(Map valueMap,Class<T> entityClass,String prefix){ ConvertEntryItem convertItem = convertItemCache.get(entityClass.getName()); if(convertItem == null){ convertItem = ConvertEntryItem.createConvertItem(entityClass); convertItemCache.put(entityClass.getName(), convertItem); } //entityClass 的可访问字段名 List<String> fieldNameList = convertItem.getFieldNameList(); //字段名和对应的set方法映射 Map<String,Method> fieldSetMethodMap = convertItem.getFieldSetMethodMap(); T entity = null; try { entity = entityClass.newInstance(); } catch (InstantiationException e) { log.error("create "+entityClass.getName()+" instance failed, Do it has a empty constructed function ?", e); return null; } catch (IllegalAccessException e) { log.error("create "+entityClass.getName()+" instance failed, Do it has a empty constructed function ?", e); return null; } Object fieldValue = null; Method m; Class<?>[] parameterTypes; Object targetValue; if(prefix == null) prefix = ""; //遍历字段列表,分别调用每个字段的set方法 for(String fieldName: fieldNameList){ fieldValue = valueMap.get(prefix+fieldName); if(fieldValue == null) continue; m = fieldSetMethodMap.get(fieldName); if(m == null) continue; //set方法的参数类型 parameterTypes = m.getParameterTypes(); if(parameterTypes.length != 1) continue; //只支持单个参数的set方法 //如果第一个参数类型和当前类型相同,则直接使用 if(parameterTypes[0].isAssignableFrom(fieldValue.getClass())){ targetValue = fieldValue; }else{ //转换当前的值为目标参数类型 targetValue = ConvertFactory.convert(parameterTypes[0], fieldValue); } if(targetValue != null){ try { //调用set方法进行赋值 m.invoke(entity, targetValue); } catch (Exception e) { log.error("set value failed:{method="+m.getName()+",value="+targetValue+"}", e); } } } return entity; } static class ConvertEntryItem{ private List<String> fieldNameList = new ArrayList<String>(); private Map<String,Method> fieldSetMethodMap = new HashMap<String, Method>(); private ConvertEntryItem(){} public List<String> getFieldNameList() { return fieldNameList; } public Map<String, Method> getFieldSetMethodMap() { return fieldSetMethodMap; } private void parseEntry(Class<?> cls){ Field[] allField = cls.getDeclaredFields(); Method m = null; String methodName; for(Field f: allField){ methodName = f.getName(); methodName = "set"+methodName.substring(0, 1).toUpperCase()+methodName.substring(1); try { //只返回和当前字段类型相符的set方法,不支持多参数以及不同类型的set方法 m = cls.getDeclaredMethod(methodName, f.getType()); if(m != null){ fieldNameList.add(f.getName()); fieldSetMethodMap.put(f.getName(), m); } } catch (SecurityException e) { log.error("parseEntry failed: SecurityException", e); } catch (NoSuchMethodException e) { log.info("NoSuchMethod in "+cls.getName()+": "+methodName); } } } public static ConvertEntryItem createConvertItem(Class<?> cls){ ConvertEntryItem ci = new ConvertEntryItem(); ci.parseEntry(cls); return ci; } } }
转换接口贴上,实话实说,偷的Spring里面的接口
/** * 类型转换接口 * @param <S> 源类型 * @param <T> 目标类型 */ public interface Convert<S,T> { T convert(S source); }
再来个具体调用转换的类:
import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class ConvertFactory { private static Log log = LogFactory.getLog(ConvertFactory.class); public static Map<String,Convert<?,?>> convertHandlers = new HashMap<String, Convert<?,?>>(); /** * 注册转换器 */ static{ convertHandlers.put(String[].class.getName()+"To"+Float[].class.getName(), new ObjectArrToFloatArrConvert()); convertHandlers.put(String[].class.getName()+"To"+float[].class.getName(), new ObjectArrToFloaArrConvert()); convertHandlers.put(String[].class.getName()+"To"+Double[].class.getName(), new ObjectArrToDoubleArrConvert()); convertHandlers.put(String[].class.getName()+"To"+double[].class.getName(), new ObjectArrToDoublArrConvert()); convertHandlers.put(String[].class.getName()+"To"+Integer[].class.getName(), new ObjectArrToIntegerArrConvert()); convertHandlers.put(String[].class.getName()+"To"+int[].class.getName(), new ObjectArrToIntArrConvert()); convertHandlers.put(String.class.getName()+"To"+Date.class.getName(), new ObjectToDateConvert()); convertHandlers.put(String.class.getName()+"To"+Double.class.getName(), new ObjectToFloatConvert()); convertHandlers.put(String.class.getName()+"To"+double.class.getName(), new ObjectToFloatConvert()); convertHandlers.put(String.class.getName()+"To"+Float.class.getName(), new ObjectToFloatConvert()); convertHandlers.put(String.class.getName()+"To"+float.class.getName(), new ObjectToFloatConvert()); convertHandlers.put(String.class.getName()+"To"+Integer.class.getName(), new ObjectToIntegerConvert()); convertHandlers.put(String.class.getName()+"To"+int.class.getName(), new ObjectToIntegerConvert()); Set<Entry<String, Convert<?,?>>> entites = convertHandlers.entrySet(); StringBuilder b = new StringBuilder(); b.append("{"); for(Entry<String, Convert<?,?>> entry: entites){ b.append(entry.getKey()).append("=").append(entry.getValue()).append(","); } b.append("}"); log.debug("all support convert type: "+b.toString().replaceFirst(",}", "}")); } @SuppressWarnings({ "unchecked", "rawtypes" }) public static <T> T convert(Class<T> clazz,Object val){ Convert cv = convertHandlers.get(val.getClass().getName()+"To"+clazz.getName()); if(cv == null){ log.info(clazz.getName()+"To"+val.getClass().getName()+ " convert failed: unsupport type"); return null; } return (T)cv.convert(val); } }
下面贴出来各种转换实现类:
import org.apache.commons.logging.LogFactory; public class ObjectArrToDoublArrConvert implements Convert<Object[],double[]> { @Override public double[] convert(Object[] source) { if(source == null) return null; double[] res = new double[source.length]; for(int i=0;i<source.length;i++){ try { res[i] = Double.parseDouble(source[i].toString()); } catch (NumberFormatException e) { LogFactory.getLog(getClass()).info("ObjectArrToDoublArrConvert failed, bad value: "+source[i].toString(), e); return null; } } return res; } }
import org.apache.commons.logging.LogFactory; public class ObjectArrToDoubleArrConvert implements Convert<Object[],Double[]> { @Override public Double[] convert(Object[] source) { if(source == null) return null; Double[] res = new Double[source.length]; for(int i=0;i<source.length;i++){ try { res[i] = Double.parseDouble(source[i].toString()); } catch (NumberFormatException e) { LogFactory.getLog(getClass()).info("ObjectArrToDoubleArrConvert failed, bad value: "+source[i].toString(), e); return null; } } return res; } }
import org.apache.commons.logging.LogFactory; public class ObjectArrToFloaArrConvert implements Convert<Object[],float[]> { @Override public float[] convert(Object[] source) { if(source == null) return null; float[] res = new float[source.length]; for(int i=0;i<source.length;i++){ try { res[i] = Float.parseFloat(source[i].toString()); } catch (NumberFormatException e) { LogFactory.getLog(getClass()).info("ObjectArrToFloaArrConvert failed, bad value: "+source[i].toString(), e); return null; } } return res; } }
import org.apache.commons.logging.LogFactory; public class ObjectArrToFloatArrConvert implements Convert<Object[],Float[]> { @Override public Float[] convert(Object[] source) { if(source == null) return null; Float[] res = new Float[source.length]; for(int i=0;i<source.length;i++){ try { res[i] = Float.parseFloat(source[i].toString()); } catch (NumberFormatException e) { LogFactory.getLog(getClass()).info("ObjectArrToFloatArrConvert failed, bad value: "+source[i].toString(), e); return null; } } return res; } }
import org.apache.commons.logging.LogFactory; public class ObjectArrToIntArrConvert implements Convert<Object[],int[]> { @Override public int[] convert(Object[] source) { if(source == null) return null; int[] res = new int[source.length]; for(int i=0;i<source.length;i++){ try { res[i] = Integer.parseInt(source[i].toString()); } catch (NumberFormatException e) { LogFactory.getLog(getClass()).info("ObjectArrToIntArrConvert failed, bad value: "+source[i].toString(), e); return null; } } return res; } }
import org.apache.commons.logging.LogFactory; public class ObjectArrToIntegerArrConvert implements Convert<Object[],Integer[]> { @Override public Integer[] convert(Object[] source) { if(source == null) return null; Integer[] res = new Integer[source.length]; for(int i=0;i<source.length;i++){ try { res[i] = Integer.parseInt(source[i].toString()); } catch (NumberFormatException e) { LogFactory.getLog(getClass()).info("ObjectArrToIntegerArrConvert failed, bad value: "+source[i].toString(), e); return null; } } return res; } }
public class ObjectArrToStringArrConvert implements Convert<Object[],String[]> { @Override public String[] convert(Object[] source) { if(source == null) return null; String[] res = new String[source.length]; for(int i=0;i<source.length;i++){ res[i] = source[i].toString(); } return res; } }
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Pattern; import org.apache.commons.logging.LogFactory; /** *支持的日期格式为:<br> *yyyy-MM-dd<br> *yyyy-MM-dd HH:mm<br> *yyyy-MM-dd HH:mm:ss<br> *yyyy/MM/dd<br> *yyyy/MM/dd HH:mm<br> *yyyy/MM/dd HH:mm:ss<br> */ public class ObjectToDateConvert implements Convert<Object,Date> { Object[][] patterns = { {Pattern.compile("^\\d+-\\d+-\\d+$"),"yyyy-MM-dd"}, {Pattern.compile("^\\d+-\\d+-\\d+ \\d+:\\d+$"),"yyyy-MM-dd HH:mm"}, {Pattern.compile("^\\d+-\\d+-\\d+ \\d+:\\d+:\\d+$"),"yyyy-MM-dd HH:mm:ss"}, {Pattern.compile("^\\d+/\\d+/\\d+$"),"yyyy/MM/dd"}, {Pattern.compile("^\\d+/\\d+/\\d+ \\d+:\\d+$"),"yyyy/MM/dd HH:mm"}, {Pattern.compile("^\\d+/\\d+/\\d+ \\d+:\\d+:\\d+$"),"yyyy/MM/dd HH:mm:ss"} }; @Override public Date convert(Object source) { if(source == null) return null; String val = source.toString(); val = val.trim(); String format = null; Pattern p; for(Object[] item:patterns){ p = (Pattern)item[0]; if(p.matcher(val).matches()){ format = item[1].toString(); break; } } if(format == null) { LogFactory.getLog(getClass()).info("ObjectToDateConvert failed, unsupport value: "+source); return null; } try { return new SimpleDateFormat(format).parse(val); } catch (ParseException e) { LogFactory.getLog(getClass()).info("ObjectToDateConvert failed, bad value: "+source,e); return null; } } }
import org.apache.commons.logging.LogFactory; public class ObjectToFloatConvert implements Convert<Object,Float> { @Override public Float convert(Object source) { if(source == null) return null; try { return Float.parseFloat(source.toString().trim()); } catch (NumberFormatException e) { LogFactory.getLog(getClass()).info("ObjectToFloatConvert failed: "+source, e); return null; } } }
import org.apache.commons.logging.LogFactory; public class ObjectToIntegerConvert implements Convert<Object,Integer> { @Override public Integer convert(Object source) { if(source == null) return null; try { return Integer.parseInt(source.toString().trim()); } catch (NumberFormatException e) { LogFactory.getLog(getClass()).info("ObjectToIntegerConvert failed: "+source, e); return null; } } }
使用方法如下:
Map<String,Object> map = new HashMap<String, Object>(); map.put("intVal", "1"); map.put("integerVal", "1"); map.put("floatVal", "1.0"); map.put("doubleVal", "1.0"); map.put("dateVal", "2012-12-12 23:00:00"); map.put("intArr", new String[]{"1","2"}); map.put("integerArr", new String[]{"1","2"}); map.put("strArr", new String[]{"A","B"}); map.put("floatArr", new String[]{"1.0","1.0"}); MapToEntryConvertUtils.convert(map, TestEntry.class, ""); MapToEntryConvertUtils.convert(map, TestEntry.class, "");
第一次转换比较慢,但是第二次因为缓存了类的属性信息所以很快
发表评论
-
接上篇补上window平台自动上传证书文件的批处理问卷
2012-09-20 12:54 1445@echo off : host=服务器证书域名或ip ... -
tomcat6的https双向认证
2012-09-19 21:41 14291.生成服务器端证书 ... -
使用c3p0数据库连接池时出现com.mchange.v2.resourcepool.TimeoutException
2012-08-20 21:08 100910有一个线上环境使用的是c3p0数据库,为外部提供接口服务。最近 ... -
定时对大数据量的表进行分表对数据备份
2012-02-25 23:37 1901工作中遇到数据库中一个表的数据量比较大,属于日志表。正常情况下 ... -
导出excel并提供下载
2012-02-24 14:03 1447工作中需要动态生成excel并提供下载,留在这个为了以后方面 ... -
Nginx + tomcat 其中出现的cookie问题
2012-01-10 15:16 1743简单说就是:cookie设置时如果设置了路径,则只对此路径下面 ... -
Spring3.0 MVC的初次尝试
2011-03-10 13:51 6600Spring的mvc在2.5的时候尝试过一次,感觉配置繁 ... -
记一次hibernate无法取得jdbc插入数据的问题折腾
2010-09-22 10:19 2522大概情况如下 前端:struts2+spring3+hibe ... -
基于jquery的ajax小例子
2010-05-29 15:01 1868献给那些懒得看jquery文档的人。 jquery比较常用的 ... -
sessionDestroyed执行时间的奇怪问题
2010-05-25 11:12 7924问题描述: 用户登陆后转到list.jsp页面,此页面不停向 ... -
Struts2+Hibernate3+Spring3简单整合练习
2010-04-28 11:38 16805第一步:Struts2环境的搭 ...
相关推荐
总结一下,XML转实体类和实体类转XML涉及的主要知识点有:Java反射API、XML解析(DOM、SAX、StAX、JAXB),以及对象的序列化和反序列化。在实际开发中,我们需要根据项目需求选择合适的工具和方法,确保数据的准确...
2. **属性访问**:`PropertyUtils`类提供了对Java对象属性的无反射访问,可以方便地获取、设置和删除属性。 3. **类型转换**:BeanUtils在属性复制时自动处理类型转换,使得不同类型的属性之间可以进行赋值。 4. *...
风光储直流微电网Simulink仿真模型:光伏发电、风力发电与混合储能系统的协同运作及并网逆变器VSR的研究,风光储直流微电网Simulink仿真模型:MPPT控制、混合储能系统、VSR并网逆变器的设计与实现,风光储、风光储并网直流微电网simulink仿真模型。 系统由光伏发电系统、风力发电系统、混合储能系统(可单独储能系统)、逆变器VSR?大电网构成。 光伏系统采用扰动观察法实现mppt控制,经过boost电路并入母线; 风机采用最佳叶尖速比实现mppt控制,风力发电系统中pmsg采用零d轴控制实现功率输出,通过三相电压型pwm变器整流并入母线; 混合储能由蓄电池和超级电容构成,通过双向DCDC变器并入母线,并采用低通滤波器实现功率分配,超级电容响应高频功率分量,蓄电池响应低频功率分量,有限抑制系统中功率波动,且符合储能的各自特性。 并网逆变器VSR采用PQ控制实现功率入网。 ,风光储; 直流微电网; simulink仿真模型; 光伏发电系统; 最佳叶尖速比控制; MPPT控制; Boost电路; 三相电压型PWM变换器;
以下是针对初学者的 **51单片机入门教程**,内容涵盖基础概念、开发环境搭建、编程实践及常见应用示例,帮助你快速上手。
【Python毕设】根据你提供的课程代码,自动排出可行课表,适用于西工大选课_pgj
【毕业设计】[零食商贩]-基于vue全家桶+koa2+sequelize+mysql搭建的移动商城应用
电动汽车充电背景下的微电网谐波抑制策略与风力发电系统仿真研究,电动汽车充电微电网的谐波抑制策略与风力发电系统仿真研究,基于电动汽车充电的微电网谐波抑制策略研究,包括电动汽车充电负 载模型,风电模型,光伏发现系统,储能系统,以及谐波处理模块 风力发电系统仿真 ,电动汽车充电负载模型; 风电模型; 光伏发现系统; 储能系统; 谐波处理模块; 风力发电系统仿真,电动汽车充电微电网的谐波抑制策略研究:整合负载模型、风电模型与光伏储能系统
Vscode部署本地Deepseek的continue插件windows版本
内容概要:本文详细介绍了滤波器的两个关键参数——截止频率(F0)和品质因素(Q),并探讨了不同类型的滤波器(包括低通、高通、带通和带阻滤波器)的设计方法及其特性。文章首先明确了F0和Q的基本概念及其在滤波器性能中的作用,接着通过数学推导和图形展示的方式,解释了不同Q值对滤波器频率响应的影响。文中特别指出,通过调整Q值可以控制滤波器的峰谷效果和滚降速度,进而优化系统的滤波性能。此外,还讨论了不同类型滤波器的具体应用场景,如低通滤波器适用于消除高频噪声,高通滤波器用于去除直流分量和低频干扰,而带通滤波器和带阻滤波器分别用于选取特定频段信号和排除不需要的频段。最后,通过对具体案例的解析,帮助读者更好地理解和应用相关理论。 适合人群:电子工程及相关领域的技术人员、研究人员以及高校学生,特别是那些需要深入了解滤波器设计原理的人群。 使用场景及目标:适用于从事模拟电路设计的专业人士,尤其是希望掌握滤波器设计细节和技术的应用场合。目标是让读者能够灵活运用Q值和F0来优化滤波器设计,提升系统的信噪比和选择性,确保信号的纯净性和完整性。
内容概要:本文主要讲述了利用QUARTUSⅡ进行电子设计自动化的具体步骤和实例操作,详细介绍了如何利用EDA技术在QUARTUSⅡ环境中设计并模拟下降沿D触发器的工作过程,重点探讨了系统规格设计、功能描述、设计处理、器件编译和测试四个步骤及相关的设计验证流程,如功能仿真、逻辑综合及时序仿真等内容,并通过具体的操作指南展示了电路设计的实际操作方法。此外还强调了QUARTUSⅡ作为一款集成了多种功能的综合平台的优势及其对于提高工作效率的重要性。 适用人群:电子工程、自动化等相关专业的学生或者工程师,尤其适用于初次接触EDA技术和QuartusⅡ的用户。 使用场景及目标:旨在帮助用户理解和掌握使用QUARTUSⅡ这一先进的EDA工具软件进行从概念设计到最后成品制作整个电路设计过程的方法和技巧。目标是在实际工作中能够熟练运用QUARTUSⅡ完成各类复杂电子系统的高效设计。 其他说明:文中通过具体的案例让读者更直观理解EDA设计理念和技术特点的同时也为进一步探索EDA领域的前沿课题打下了良好基础。此外它还提到了未来可能的发展方向,比如EDA工具的功能增强趋势等。
Simulink建模下的光储系统与IEEE33节点配电网的协同并网运行:光照强度变化下的储能系统优化策略与输出性能分析,Simulink模型下的光伏微网系统:光储协同,实现380v电压等级下的恒定功率并网与平抑波动,Simulink含光伏的IEEE33节点配电网模型 微网,光储系统并网运行 光照强度发生改变时,储能可以有效配合光伏进行恒定功率并网,平抑波动,实现削峰填谷。 总的输出有功为270kw(图23) 无功为0 检验可以并网到电压等级为380v的电网上 逆变侧输出电压电流稳定(图4) ,Simulink; 含光伏; 配电网模型; 微网; 光储系统; 储能配合; 恒定功率并网; 电压等级; 逆变侧输出。,Simulink光伏微网模型:光储协同并网运行,实现功率稳定输出
基于Andres ELeon新法的双馈风机次同步振荡抑制策略:附加阻尼控制(SDC)的实践与应用,双馈风机次同步振荡的抑制策略研究:基于转子侧附加阻尼控制(SDC)的应用与效能分析,双馈风机次同步振荡抑制策略(一) 含 基于转子侧附加阻尼控制(SDC)的双馈风机次同步振荡抑制,不懂就问, 附加阻尼控制 (SDC)被添加到 RSC 内部控制器的q轴输出中。 这种方法是由Andres ELeon在2016年提出的。 该方法由增益、超前滞后补偿器和带通滤波器组成。 采用实测的有功功率作为输入信号。 有关更多信息,你可以阅读 Andres ELeon 的lunwen。 附lunwen ,关键词:双馈风机、次同步振荡、抑制策略;转子侧附加阻尼控制(SDC);RSC内部控制器;Andres ELeon;增益;超前滞后补偿器;带通滤波器;实测有功功率。,双馈风机次同步振荡抑制技术:基于SDC与RSCq轴控制的策略研究
springboot疫情防控期间某村外出务工人员信息管理系统--
高效光伏并网发电系统MATLAB Simulink仿真设计与MPPT技术应用及PI调节闭环控制,光伏并网发电系统MATLAB Simulink仿真设计:涵盖电池、BOOST电路、逆变电路及MPPT技术效率提升,光伏并网发电系统MATLAB Simulink仿真设计。 该仿真包括电池,BOOST升压电路,单相全桥逆变电路,电压电流双闭环控制部分;应用MPPT技术,提高光伏发电的利用效率。 采用PI调节方式进行闭环控制,SPWM调制,采用定步长扰动观测法,对最大功率点进行跟踪,可以很好的提高发电效率和实现并网要求。 ,光伏并网发电系统; MATLAB Simulink仿真设计; 电池; BOOST升压电路; 单相全桥逆变电路; 电压电流双闭环控制; MPPT技术; PI调节方式; SPWM调制; 定步长扰动观测法。,光伏并网发电系统Simulink仿真设计:高效MPPT与PI调节控制策略
PFC 6.0高效循环加载系统:支持半正弦、半余弦及多级变荷载功能,PFC 6.0循环加载代码:支持半正弦、半余弦及多级变荷载的强大功能,PFC6.0循环加载代码,支持半正弦,半余弦函数加载,中间变荷载等。 多级加载 ,PFC6.0; 循环加载代码; 半正弦/半余弦函数加载; 中间变荷载; 多级加载,PFC6.0多级半正弦半余弦循环加载系统
某站1K的校园跑腿小程序 多校园版二手市场校园圈子失物招领 食堂/快递代拿代买跑腿 多校版本,多模块,适合跑腿,外卖,表白,二手,快递等校园服务 需要自己准备好后台的服务器,已认证的小程序,备案的域名!
【Python毕设】根据你提供的课程代码,自动排出可行课表,适用于西工大选课
COMSOL锂枝晶模型:五合一的相场、浓度场与电场模拟研究,涵盖单枝晶定向生长、多枝晶生长及无序生长等多元现象的探索,COMSOL锂枝晶模型深度解析:五合一技术揭示单枝晶至雪花枝晶的生长机制与物理场影响,comsol锂枝晶模型 五合一 单枝晶定向生长、多枝晶定向生长、多枝晶随机生长、无序生长随机形核以及雪花枝晶,包含相场、浓度场和电场三种物理场(雪花枝晶除外),其中单枝晶定向生长另外包含对应的参考文献。 ,comsol锂枝晶模型; 五合一模型; 单枝晶定向生长; 多枝晶定向生长; 多枝晶随机生长; 无序生长随机形核; 雪花枝晶; 相场、浓度场、电场物理场; 参考文献,COMSOL锂枝晶模型:多场景定向生长与相场电场分析
嵌入式大学生 点阵代码
那个有delphi12 tedgebrowser 使用的dll