特性与反射:从Java注解到物理规律的跨领域实践
特性与反射一次跨领域的知识串联与实践总结特性和反射这两个词我在工作和学习中几乎每天都会碰到但说实话真正把它们放在一起系统梳理还是最近整理项目文档时才动了这个念头。编程里有Java的注解特性、Unity的Attribute机制以及配套的反射API物理世界里电磁波、声波在界面上的反射规律电路设计中电阻电容电感的频率特性——这些看似八竿子打不着的领域抽离出来看底层逻辑惊人地一致都是系统对外部输入的可预测响应。这篇文章我不打算写成学术论文而是以我自己跨领域折腾的经验为基础把特性与反射这套知识串联起来分编程实践、物理规律、电路分析三个大块配合实际案例和踩坑记录聊聊它们到底是什么、能做什么、怎么用才不会翻车。适合正在学Java反射的开发者、被Unity特性绕晕的新手、以及想系统理解声波/电磁波反射规律和RLC元件频率特性的电子爱好者。1. 一句话说透特性与反射的本质关系1.1 特性是标签反射是运行时读标签的能力先聊我接触最多的编程领域。Java里的注解Annotation和Unity里的Attribute本质上都是特性Attribute的实例化表达。它们不包含业务逻辑只是给代码元素类、方法、字段贴上的元数据标签。比如Java里常见的OverrideUnity里的[SerializeField]这些标签本身不做任何事——真正让它们发挥威力的是反射Reflection。反射是什么就是程序在运行过程中动态获取类的完整结构信息类名、方法、字段、注解并能在运行时调用这些成员的能力。Java里你用Class.forName(com.example.Player)拿到类的Class对象再通过getDeclaredMethods()、getAnnotation(MyTag.class)读取你想要的元数据和成员。Unity里配合C#的反射你可以遍历所有挂载了某个自定义特性的字段批量完成序列化、依赖注入、或者自动注册逻辑。我自己写一个轻量级DI工具时就靠着特性反射的组合避免了上百行手写工厂代码——这就是这对组合的第一个核心价值把代码的配置信息集中到声明处再用统一的机制在运行时解释执行。1.2 从生活类比看反射的哲学很多人觉得反射晦涩我一般用演员与剧本来类比写代码时类是剧本实例是演员平常开发是按剧本来演——编译期就定好了调用的方法和属性。反射则像是后台导演组在演出进行过程中翻剧本Class对象临时安排谁上场、改哪句台词、调用哪个隐藏道具私有方法。但后台导演组有一个禁忌尽量不要干预正在演出的演员。因为反射绕过编译器的类型检查调错了方法签名或字段名运行时才抛出NoSuchMethodException错误被发现的时间点被推后到了运行时。这种动态性既是灵活性也是风险源。1.3 Unity里的特性与反射序列化与Inspector面板的秘密Unity新手经常好奇为什么我写了一个public int health;它在Inspector面板能直接改但改成private int health;就不显示了其实Unity引擎内部大量使用反射Inspector面板本质上是引擎通过反射获取MonoBehaviour的子类所有可序列化字段并渲染出来的结果。如果你给私有字段加上[SerializeField]特性告诉引擎这个算了我允许你序列化它它就会重新出现在面板上。[Range(0,100)]则是给字段附加一个值域约束Inspector渲染时读取这个特性决定UI控件是滑条还是输入框。所以理解Unity特性的关键点特性是给引擎看的注释反射是引擎读取注释的方式。你自己也可以写一个自定义特性比如[EnemyTag(Boss)]再用反射遍历场景中的所有GameObject找到带这个标记的敌人做特殊AI初始化——这是编辑器扩展、自动化测试、关卡数据检查的常见玩法。2. 编程域核心细节Java反射与Unity特性的实操要点2.1 Java反射三步走拿到Class、获取成员、触发调用我不打算把API列表铺一遍只讲最常用、最容易出错的三段代码骨架。第一段获取Class对象Class? clazz Class.forName(com.example.Player); Class? clazz2 Player.class; Class? clazz3 new Player().getClass();三种写法等价但Class.forName需要全限定名且会触发类初始化静态块执行Player.class不会。如果你只是想拿元数据做静态检查用Player.class性能更好、更安全。第二段获取方法并调用Method method clazz.getDeclaredMethod(privateMethod, String.class); method.setAccessible(true); // 默认只能访问公有成员私有需强开权限 Object result method.invoke(instance, arg);这里有个极其关键的坑getDeclaredMethod只拿本类声明的方法拿不到父类继承的getMethod能拿继承的公有方法但拿不到私有方法。调试时找不到目标方法先想想是不是声明和继承的区分问题。第三段读取注解MyTag tag clazz.getAnnotation(MyTag.class); if (tag ! null) { System.out.println(tag.value()); } Field field clazz.getDeclaredField(health); field.setAccessible(true); int value (int) field.get(instance);若注解的Retention不是RUNTIME反射运行时根本读不到。这是新手容易踩的第一大坑自定义注解默认保留在CLASS字节码阶段运行时不保留需要显式写成Retention(RetentionPolicy.RUNTIME)。2.2 Unity自定义特性实战一个组件依赖注入的例子写一个小工具让开发者在MonoBehaviour里声明字段依赖由编辑器脚本自动完成注入。步骤定义特性类继承PropertyAttribute或System.Attribute均可using System; [AttributeUsage(AttributeTargets.Field)] public class InjectFromComponent : Attribute { public string ComponentTypeFullName { get; set; } public InjectFromComponent(Type componentType) { ComponentTypeFullName componentType.FullName; } }在目标组件字段上标记public class PlayerController : MonoBehaviour { [InjectFromComponent(typeof(Rigidbody2D))] private Rigidbody2D rb; }写一个编辑器菜单或RuntimeInitializeOnLoadMethod用反射遍历所有MonoBehaviour为带特性的字段赋值using System.Reflection; using UnityEngine; public static class DependencyInjector { [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void Inject() { var allBehaviours Object.FindObjectsOfTypeMonoBehaviour(); foreach (var behaviour in allBehaviours) { var fields behaviour.GetType().GetFields( BindingFlags.NonPublic | BindingFlags.Instance ); foreach (var field in fields) { var attr field.GetCustomAttributeInjectFromComponent(); if (attr null) continue; var component behaviour.GetComponent(field.FieldType); if (component null) { Debug.LogWarning(${behaviour.name} missing {field.FieldType}); continue; } field.SetValue(behaviour, component); } } } }这套方案的优点很直接字段注入点与组件声明分离新增依赖只需要加一个新特性标签不再需要手写GetComponent。但要留意性能FindObjectsOfType和反射遍历在场景里组件数量很大时会有启动卡顿建议配合[RuntimeInitializeOnLoadMethod]只在开发模式下启用或者用缓存把FieldInfo存下来。注意Unity中GetComponent要放在Awake里做但反射注入的时机在BeforeSceneLoad阶段早于所有Awake所以依赖不会产生空引用——这是这个方案的微妙好处。2.3 反射常见坑泛型、私有成员与错误签名我整理了这几年遇到的高频问题直接放表格更方便查阅问题原因解决ClassNotFoundException类名拼写错或类不在当前类加载器可见范围打印classLoader的可见路径做排查NoSuchMethodException: XgetDeclaredMethodvsgetMethod用混检查方法是否为继承、是否为私有IllegalArgumentException方法参数类型与invoke传入实参不匹配invoke时不用拆箱直接传Object即可但要注意基本类型不能直接传int要传包装类IntegerInvocationTargetException被调用方法内部抛异常用e.getCause()取原始异常否则你看到的堆栈是反射包装的泛型方法/字段反射获取异常泛型擦除后签名与声明时不一致用getDeclaredMethod(name, parameterTypes)时参数类型必须与擦除后的类型一致例如ListString是List.class私有成员访问失效setAccessible(true)后仍报IllegalAccessException检查是否在Java模块化系统JPMS下运行跨模块需要--add-opens第三个问题我补充一个实战场景我做过一个ORM迷你框架用户实体类里有private LocalDate birthday;反射赋值时我用field.get(instance)拿到的值是LocalDate对象但反射field.set()要求传入的参数类型必须与字段类型完全匹配。如果手滑传了个java.util.DateIllegalArgumentException立刻抛出——这提醒我在写通用框架时一定要对日期、枚举等特殊类型做转换适配。3. 物理世界电磁波与声波的反射规律3.1 反射定律背后的相位突变半波损失到底怎么回事从编程跨到物理。声波在反射界面的相位变化是很多物理课上只给结论、不给过程的点。先说结论波从波疏介质声阻抗小射向波密介质声阻抗大时反射波会发生相位突变π即所谓半波损失从波密射向波疏则无相位突变。我用机械波的一维弦模型来理解当波从细绳低线密度传向粗绳高线密度连接点是固定的入射波与反射波在固定端点叠加为驻波端点必须是波节。为了保证端点始终是节点反射波的相位必须与入射波正好相反——这就是半波损失的本质。反过来如果粗到细自由端端点是波腹反射波与入射波同相没有半波损失。电磁波同理。当光从空气低折射率射入玻璃高折射率电场矢量在反射时反向相当于相位突变π从玻璃射回空气则相位连续。这个现象的工程影响很大——光纤通信里的反射损耗、镀膜设计里的增透/增反膜、雷达隐身中对反射波相位的控制底层都是这回事。3.2 声波反射的工程应用声呐、混响与噪声控制声波反射不只是实验室题目。水下声呐就是主动发射声脉冲接收海底或目标物体的反射回波通过往返时间测距、通过回波强度判断材质。这里有个现实技术难点混响干扰。水中气泡、悬浮颗粒、海面波浪都会产生散射回波像雷达里的杂波一样淹没真实信号。做声呐信号处理的工程师会靠脉冲压缩、匹配滤波、波束成形等算法把目标回波从混响背景中提出来。室内声学里混响时间的计算靠的就是反射路径累积。一个演讲厅如果大理石地面和光墙太多声音反射过强说话就有嗡嗡的混响感加吸音棉的意义在于把反射能量转化为热能用多孔材料的黏性摩擦耗损声能。我做家庭影院的隔音方案时针对低频驻波常见在40~100Hz用赫姆霍兹共振器吸音针对中高频用聚酯纤维吸音板效果立刻不一样。这个经验参考价值很高反射是敌人时吸音就是武器反射是朋友时如音乐厅顶棚反射板你就该精心设计反射路径来增强声场。3.3 电磁波反射经验为什么金属是最好的镜子电磁波打在导电材料表面电场驱动自由电子重新辐射次级电磁波宏观叠加结果就是反射波。良导体表面金属的自由电子密度极高几乎可以反射全部的入射电磁波能量所以金属是微波暗室里屏蔽房做成金属箱、雷达反射截面里大型金属目标异常醒目的原因。但要注意金属对电磁波的反射与频率有关尤其在低频段趋肤深度会增大。比如电磁屏蔽室工频50Hz干扰的屏蔽层需要很厚或者多层结构而微波频段贴一层铜箔就行。实测过2.4GHz WiFi信号隔着薄金属板衰减极其明显而同样的金属板对100kHz的磁场屏蔽系数显著下降——这提醒电子设计师在做产品EMC整改时屏蔽材料的厚度和导电连续性必须按目标干扰频率来设计。4. 电路领域电阻电容电感的频率特性4.1 R、L、C的特性到底指什么电阻、电容、电感三个元件在直流电路里的行为与其在交流电路里的行为完全不同。所谓特性本质上可以用阻抗频率响应来统一描述元件阻抗表达式频率降低时频率升高时相位关系电压-电流电阻RZ R纯阻不变不变同相电容CZ 1/(jωC)阻抗增大阻抗减小电压滞后电流90°电感LZ jωL阻抗减小阻抗增大电压超前电流90°电容在低频时如同开路、高频时如同短路这就是滤波电路中电容能隔直通交的原因电感正好相反通直阻交。一个信号经过RC低通滤波器频率越高衰减越严重本质上是电容分压效应随频率变化。我调试电源去耦电路时常看到新手在板上放了一堆大容量电解电容但高频噪声纹丝不动原因就是电解电容的等效串联电阻ESR和等效电感ESL较大高频下阻抗不降反升。实际选型必须看元件的高频寄生参数曲线不能只靠理想公式。4.2 RLC电路的谐振特性反射和吸收的控制当电阻、电感、电容组合成串联或并联谐振电路阻抗呈现出极强的频率选择性。以串联RLC为例谐振角频率为ω₀ 1/√(LC)在谐振点附近感抗与容抗相互抵消只剩下电阻分量电路呈现纯阻性且阻抗最小。若把这段RLC并联在信号线上做陷波器就能把特定频率的能量吸收掉防止它反射回源端。我做音频分频器时对这一点体会很深一个二阶Linkwitz-Riley滤波器本质就是两组RLC网络的频率特性拼接。分频点处的阻抗匹配如果偏差过大喇叭的阻抗曲线会出现一个峰功放输出电流相位畸变声音发糊。设计时必须把喇叭自身的阻抗频率响应一并纳入计算而不是只考虑分频器的LC理想值。另一个高频布线层面的反射概念是信号完整性的反射。在高速数字电路中PCB走线可以看成一根传输线当阻抗不连续比如过孔、直角拐角、连接器时入射信号的一部分会被反射回源端形成振铃ringing严重时会导致逻辑误判。解决手段就是阻抗匹配——在信号源端串接电阻源端端接或者在末端并联阻尼电阻。这个与电磁波在介质界面的反射如出一辙特性阻抗就是介质对波的感受匹配就是让波无反射地进入下一段。5. 实操中的常见问题与排查心态跨领域避坑清单5.1 编程调试中的反射失效三连我在项目里总结经验反射相关bug高发点有三个注解保留策略不对。很多人自定义注解时忘了Retention(RUNTIME)反射读取返回null排查半天找不出问题。我的习惯是所有自定义注解写完第一行就加上Retention(RetentionPolicy.RUNTIME)和Target(ElementType.FIELD)防止半路再改。混淆或裁剪导致成员丢失。打包Android或Unity后ProGuard或IL2CPP裁剪会移除未被直接引用的字段和方法反射调用时直接找不到。解决办法是在proguard配置中-keep相关类或Unity中加[Preserve]特性标记反射目标。性能误区。反射确实比直接调用慢一个数量级但大多数业务场景每秒调用几千次依然可忽略。真正的性能陷阱是反复在循环内执行getField——因为每次getField都要遍历元数据数组。我的优化策略是启动时把反射结果缓存到Dictionary运行时只做字典查找与调用。5.2 物理实验与电路调试中的反射误读做声波相位实验时最坑的是麦克风与数据采集卡的采样率有微小漂移导致相位差计算结果随时间缓慢变化容易被误读为介质差异造成的相位突变。排查办法先做一组对称参考测量两端麦克风互换位置采样差值在系统误差范围内才能当真。电路调试时用示波器测高频信号发现振铃先不要急着怀疑元件参数。我曾经的教训探头地线过长形成的寄生电感与探头电容共振会人为制造反射纹波。换成短接地弹簧波形立刻干净——很多反射其实是测量系统的反射不是电路的。5.3 我的经验心得如何用特性与反射的思维快速定位问题走到这一个总结层面我认为这个词汇组合最根本的价值在于一套方法论先摸清对象的特征输入输出关系、阻抗、结构信息再用恰当的反射式机制在运行时或边界处感知和利用这些特征。比如排查一个诡异Bug我能快速确定它是不是特性与反射类问题就看两点这个对象是静态固定的还是在运行过程中需要被动态发现与改写我要使用的信息在编译期可见还是需要在运行时通过元层面去读取如果是前者老老实实写代码、直接调用即可如果是后者就引入反射、音波/电磁波反射模型、阻抗匹配设计。这条思路让我在架构设计时总能多一层元视野不至于被眼前的对象操作困住。最后分享一个实用习惯每接触一个新类库或新硬件我习惯先问它的特性是什么我可以怎么反射式地感知它——比如看文档前先跑一段反射脚本打印类的所有公共方法比如用扫频仪快速测一遍房间里声学反射最严重的频段。多次下来你会发现自己排查问题的路子会比别人宽不少。

相关新闻

Go语言教学实战:从环境配置到长安链智能合约开发

Go语言教学实战:从环境配置到长安链智能合约开发

1. 开篇:一个“非典型学长”的第八天今天是我作为 GO 学长的第八天。之所以在标题里加个“初当”,是因为我压根不是科班出身的“大神”,纯粹是被学院抓壮丁,负责给大一学弟学妹们带 Go 语言入门。八天下来,最大的感受就…

2026/10/10 1:34:10 阅读更多 →
稳定细胞系构建全流程:从载体设计到高表达克隆筛选

稳定细胞系构建全流程:从载体设计到高表达克隆筛选

1. 稳定细胞系构建到底在解决什么问题1.1 为什么不直接用瞬时转染很多人第一次接触稳定细胞系构建,都会问同一个问题:我瞬时转染出来的表达量已经够了啊,为什么还要花两三个月去做稳定株开发?这个问题问得很实在,我也确…

2026/10/10 1:34:18 阅读更多 →
基于JSP+Servlet+Tomcat的电子图书管理系统设计与部署实战

基于JSP+Servlet+Tomcat的电子图书管理系统设计与部署实战

简介:基于JSP、Servlet与Tomcat实现的电子图书管理系统源码,适合Java Web初学者、做课程设计或小组合作项目参考。系统融合Bootstrap前端样式,业务模块覆盖用户登录注册、图书列表展示、图书详情、新增与更新图书、借阅管理等场景&#xff0c…

2026/10/10 1:34:25 阅读更多 →

最新新闻

Obsidian离线插件实战指南:断网不崩、本地全控的生产力底座

Obsidian离线插件实战指南:断网不崩、本地全控的生产力底座

简介:本资源是面向Obsidian深度用户与离线环境工作者的「离线插件大全」,专为无法稳定访问官方插件社区的场景设计,解决第三方插件安装受阻、网络受限时的功能扩展难题。压缩包共967个文件,涵盖686个可直接部署的插件ZIP包&#x…

2026/10/10 4:13:39 阅读更多 →
知识蒸馏到Agent蒸馏:OPD在线策略蒸馏的原理与工程实践

知识蒸馏到Agent蒸馏:OPD在线策略蒸馏的原理与工程实践

知识蒸馏这几年在模型压缩和训练加速上都快被讲烂了,但一旦把问题从“教一个网络模仿另一个网络”换成“教一个 Agent 模仿另一个 Agent”,事情立刻就不一样了。标题里那串词——知识蒸馏、OPD、策略梯度、Agent——看着像四个独立概念,实际是…

2026/10/10 4:13:39 阅读更多 →
新电脑硬盘分区实战指南:从原理到三种落地方法

新电脑硬盘分区实战指南:从原理到三种落地方法

1. 为什么新电脑硬盘分区这件事,比你想象中更重要?“新电脑到手第一件事该干啥?”——很多人会说装软件、调壁纸、连WiFi。但真正决定这台机器未来三年用得顺不顺、卡不卡、重装系统麻不麻烦的,其实是开机后那几分钟里&#xff0c…

2026/10/10 4:13:39 阅读更多 →
医院超声影像系统落地:DICOM接入、存储调阅与DICOMweb实践

医院超声影像系统落地:DICOM接入、存储调阅与DICOMweb实践

简介:医院超声影像系统是一套面向医疗机构的信息化解决方案,围绕护士端与医生端协同工作,覆盖患者登记、排队叫号、超声影像查看与诊断分析等环节,适合医疗软件开发人员、医院信息科人员及医学信息化方向的学习者参考。资源包共23…

2026/10/10 4:13:39 阅读更多 →
PCA9422与STM32L073RZ低功耗电源管理方案设计与I2C配置实战

PCA9422与STM32L073RZ低功耗电源管理方案设计与I2C配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 4:13:39 阅读更多 →
多Agent集群24小时稳定运行实战:架构设计、调度机制与运维踩坑记录

多Agent集群24小时稳定运行实战:架构设计、调度机制与运维踩坑记录

这段时间我折腾出来一套 24 小时不停工作的多 Agent 集群,不是那种跑几分钟就结束的 demo,而是真的把一堆 AI Agent 挂在后台,日复一日地处理任务。这个项目从构思到稳定运行,前前后后踩了不少坑,也把很多藏在文档背后…

2026/10/10 4:12:39 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →