<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>反射 on 蛋蛋忧桑</title><link>https://dandansad.com/tags/%E5%8F%8D%E5%B0%84/</link><description>Recent content in 反射 on 蛋蛋忧桑</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Tue, 11 Mar 2025 01:59:54 +0800</lastBuildDate><atom:link href="https://dandansad.com/tags/%E5%8F%8D%E5%B0%84/index.xml" rel="self" type="application/rss+xml"/><item><title>Highway-Toll-Framework</title><link>https://dandansad.com/2025/03/11/highway-toll-framework/</link><pubDate>Tue, 11 Mar 2025 01:59:54 +0800</pubDate><guid>https://dandansad.com/2025/03/11/highway-toll-framework/</guid><description>&lt;p&gt;一个高速收费站框架，新增车辆类型（包括是真的新增车辆类型或者同一类型车辆叫法不同）不用修改原有代码，只需要在类上加注解（或注解配合properties配置文件）即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;highway
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Main.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; MainV2.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; MainV3.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; MainV4.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;+---&lt;/span&gt;annotation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; VehicleType.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; VehicleTypeV2.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;+---&lt;/span&gt;config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; VehicleConfig.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;+---&lt;/span&gt;toll
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; TollManager.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; TollManagerV2.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; TollManagerV3.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; TollManagerV4.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;vehicle
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Bus.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Car.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; NewElectricCar.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; NewEmergencyVehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; NewMotorcycle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Truck.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Vehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;+---&lt;/span&gt;v2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Bus.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Car.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; ElectricCar.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; EmergencyVehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Motorcycle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Truck.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Vehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;+---&lt;/span&gt;v3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; BaseVehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Bus.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Car.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; ElectricCar.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; EmergencyVehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Motorcycle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Truck.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; Vehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;---&lt;/span&gt;v4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; BaseVehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Bus.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Car.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ElectricCar.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; EmergencyVehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Motorcycle.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Truck.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Vehicle.java
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1-单纯使用注解信息"&gt;&lt;a href="#1-%e5%8d%95%e7%ba%af%e4%bd%bf%e7%94%a8%e6%b3%a8%e8%a7%a3%e4%bf%a1%e6%81%af" class="header-anchor"&gt;&lt;/a&gt;1. 单纯使用注解信息
&lt;/h2&gt;&lt;h3 id="注解类"&gt;&lt;a href="#%e6%b3%a8%e8%a7%a3%e7%b1%bb" class="header-anchor"&gt;&lt;/a&gt;注解类
&lt;/h3&gt;&lt;p&gt;在注解类中定义所需要的元素，这里是一个名称列表和每公里收费。&lt;/p&gt;
&lt;h3 id="收费管理器类"&gt;&lt;a href="#%e6%94%b6%e8%b4%b9%e7%ae%a1%e7%90%86%e5%99%a8%e7%b1%bb" class="header-anchor"&gt;&lt;/a&gt;收费管理器类
&lt;/h3&gt;&lt;p&gt;在收费管理器类中扫描和加载所有带有@VehicleType注解的车辆类，并提供计算收费的方法。在这里获取信息是直接通过注解进行的。&lt;/p&gt;
&lt;h3 id="车辆接口"&gt;&lt;a href="#%e8%bd%a6%e8%be%86%e6%8e%a5%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;车辆接口
&lt;/h3&gt;&lt;p&gt;车辆接口，用于提供一个默认方法计算车辆收费。&lt;/p&gt;
&lt;h3 id="各种车辆类"&gt;&lt;a href="#%e5%90%84%e7%a7%8d%e8%bd%a6%e8%be%86%e7%b1%bb" class="header-anchor"&gt;&lt;/a&gt;各种车辆类
&lt;/h3&gt;&lt;p&gt;只需要在类前加上@VehicleType注解，指定相应值即可，不用侵入原有代码。&lt;/p&gt;
&lt;h3 id="主函数"&gt;&lt;a href="#%e4%b8%bb%e5%87%bd%e6%95%b0" class="header-anchor"&gt;&lt;/a&gt;主函数
&lt;/h3&gt;&lt;p&gt;创建TollManager实例进行业务逻辑。&lt;/p&gt;
&lt;h2 id="2-配合properties配置文件"&gt;&lt;a href="#2-%e9%85%8d%e5%90%88properties%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;2. 配合properties配置文件
&lt;/h2&gt;&lt;h3 id="注解类-1"&gt;&lt;a href="#%e6%b3%a8%e8%a7%a3%e7%b1%bb-1" class="header-anchor"&gt;&lt;/a&gt;注解类
&lt;/h3&gt;&lt;p&gt;在注解类中定义所需要的元素，在配合properties配置文件的情况下只需要一个配置文件中的键名。&lt;/p&gt;
&lt;h3 id="车辆配置管理类"&gt;&lt;a href="#%e8%bd%a6%e8%be%86%e9%85%8d%e7%bd%ae%e7%ae%a1%e7%90%86%e7%b1%bb" class="header-anchor"&gt;&lt;/a&gt;车辆配置管理类
&lt;/h3&gt;&lt;p&gt;从配置文件（vehicles.properties）中读取和管理车辆相关的配置信息。&lt;/p&gt;
&lt;h3 id="收费管理器类-1"&gt;&lt;a href="#%e6%94%b6%e8%b4%b9%e7%ae%a1%e7%90%86%e5%99%a8%e7%b1%bb-1" class="header-anchor"&gt;&lt;/a&gt;收费管理器类
&lt;/h3&gt;&lt;p&gt;在收费管理器类中扫描和加载所有带有@VehicleType注解的车辆类，并提供计算收费的方法。在这里获取信息是先拿到注解中的配置文件中的键名，再通过车辆配置管理类提供的方法从配置文件中获取相应的数据。&lt;/p&gt;
&lt;h3 id="车辆接口-1"&gt;&lt;a href="#%e8%bd%a6%e8%be%86%e6%8e%a5%e5%8f%a3-1" class="header-anchor"&gt;&lt;/a&gt;车辆接口
&lt;/h3&gt;&lt;p&gt;车辆接口，用于提供一个默认方法计算车辆收费。&lt;/p&gt;
&lt;h3 id="各种车辆类-1"&gt;&lt;a href="#%e5%90%84%e7%a7%8d%e8%bd%a6%e8%be%86%e7%b1%bb-1" class="header-anchor"&gt;&lt;/a&gt;各种车辆类
&lt;/h3&gt;&lt;p&gt;只需要在类前加上@VehicleType注解，指定相应值即可，不用侵入原有代码。&lt;/p&gt;
&lt;h3 id="主函数-1"&gt;&lt;a href="#%e4%b8%bb%e5%87%bd%e6%95%b0-1" class="header-anchor"&gt;&lt;/a&gt;主函数
&lt;/h3&gt;&lt;p&gt;创建TollManager实例进行业务逻辑。&lt;/p&gt;
&lt;h2 id="3-只用properties配置文件不用注解"&gt;&lt;a href="#3-%e5%8f%aa%e7%94%a8properties%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6%e4%b8%8d%e7%94%a8%e6%b3%a8%e8%a7%a3" class="header-anchor"&gt;&lt;/a&gt;3. 只用properties配置文件，不用注解
&lt;/h2&gt;&lt;p&gt;只用properties配置文件唯一的不同就在于，将类的所有信息都放在配置文件中，包括类名，名称，价格等等，只需要从配置文件中读取即可。&lt;/p&gt;
&lt;h2 id="4-使用-reflections-库"&gt;&lt;a href="#4-%e4%bd%bf%e7%94%a8-reflections-%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;4. 使用 Reflections 库
&lt;/h2&gt;&lt;p&gt;使用reflections库，信息读取的方式变成了使用 Reflections 扫描指定包下的所有 Vehicle 实现类，从实现类中读取信息。&lt;/p&gt;
&lt;h2 id="5-主要区别"&gt;&lt;a href="#5-%e4%b8%bb%e8%a6%81%e5%8c%ba%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;5. 主要区别
&lt;/h2&gt;&lt;p&gt;用不用配置文件的主要区别就在于&lt;strong&gt;注解中信息的多少&lt;/strong&gt;，你可以把全部信息都放到注解中，也可以只放一个配置文件中的键名。在之后的获取信息步骤，要么通过注解拿到所有信息，要么通过注解中的键名用车辆配置管理类从配置文件（vehicles.properties）中读取和管理车辆相关的配置信息。&lt;/p&gt;
&lt;p&gt;使用不同的方法的主要区别就是读取信息方式的不同，单纯用注解就是到注解中获取所需的信息；注解加配置文件就是先从注解中读取键名，再到配置文件中读取其他信息；只用properties配置文件，不用注解就只从配置文件中读取信息；使用 Reflections 库就是使用 Reflections 扫描指定包下的所有 Vehicle 实现类，从实现类中读取信息。&lt;/p&gt;</description></item></channel></rss>