Bendi新闻
>
利用 Java 反射机制提高 SpringBoot 的代码质量

利用 Java 反射机制提高 SpringBoot 的代码质量

6月前

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7293118779781955634


保持好的代码质量和遵守编码标准是开发可维护和健壮软件的重要方面。在 Spring Boot 应用程序中,确保始终遵循命名约定、代码结构和其他质量标准是一项艰巨的任务,尤其是当项目的复杂性和规模不断扩大时更是如此。

在本文中,我们将探讨如何使用 Java 反射来提高 Spring Boot 应用程序的代码质量和可维护性。

代码质量的重要性

代码质量不仅仅是个人喜好的问题;它直接影响项目的可维护性、可扩展性和健壮性。代码质量的一致性对于基于团队的开发至关重要,因为它可以促进协作、减少混乱,并使得随着时间的推移更容易管理和发展代码库。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

Spring Boot 项目中的痛点问题

Spring Boot 以其强大的功能和灵活性,使开发人员能够构建广泛的应用程序。然而,Spring Boot 极具吸引力的灵活性也可能导致代码质量不一致。开发人员可能会无意中偏离既定的命名约定、项目结构和编码标准。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

使用 Java 反射来提高质量

为了解决这些代码质量带来的风险,我们可以利用 Java强大的反射功能来扫描和验证我们的代码库。Java 反射允许我们在运行时检查和操作类、方法、字段和其他代码元素。我们可以使用它来强制命名约定、验证方法签名并确保遵守编码标准。

Demo

让我们深入研究一个实际示例,了解如何利用 Java 反射来提高 Spring Boot 应用程序中的代码质量:

第 1 步:创建 NamingConventionValidator

在您的 Spring Boot 项目中,创建一个NamingConventionValidator类。此类将包含使用 Java 反射进行命名约定验证的逻辑。

import jackynote.pro.utils.ClassScanner;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.regex.Pattern;

@Log4j2
@Component
public class NamingConventionValidator {

    /**
     * Some examples of valid class names:
     *
     * com.example.MyClass
     * MyClass
     * _MyClass
     * $SomeClass
     * Some invalid examples:
     *
     * 1MyClass (can't start with number)
     * My Class (no spaces allowed)
     */

    private static final Pattern CLASS_NAME_PATTERN = Pattern.compile("([a-zA-Z_$][a-zA-Z\d_$]*\.)*[a-zA-Z_$][a-zA-Z\d_$]*");

    /**
     * The regex used checks:
     *
     * Must start with a lowercase letter
     * Can contain letters, numbers, underscores after first character
     * Some examples of valid method names:
     *
     * getUser
     * calculateTotal
     * _processData
     * Some invalid examples:
     *
     * 1calculate (can't start with number)
     * GetUser (must start lowercase)
     * Some best practices for method name validation:
     *
     * Start with lowercase letter
     * Use camelCase notation
     * No spaces or special characters besides _
     * Use verb or verb phrase names for methods
     * Use nouns for getters and setters
     * Avoid overly long names
     */

    private static final Pattern METHOD_NAME_PATTERN = Pattern.compile("[a-z][a-zA-Z0-9_]*");

    public void validateNamingConventions(String basePackage) {
        log.info("Execute validateNamingConventions");
        String[] classNames = ClassScanner.getClassesInPackage(basePackage);

        for (String className: classNames) {
            if (!CLASS_NAME_PATTERN.matcher(className).matches()) {
                throw new NamingConventionViolationException("Class name violation: " + className);
            }

            Class<?> clazz;
            try {
                clazz = Class.forName(className);
                Method[] methods = clazz.getDeclaredMethods();
                for (Method method : methods) {
                    System.out.print(method.getName());
                    if (!METHOD_NAME_PATTERN.matcher(method.getName()).matches()) {
                        throw new NamingConventionViolationException("Method name violation in class " + className + ": " + method.getName());
                    }
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

第 2 步:创建 ClassScanner 实用程序

您需要一个实用程序类ClassScanner来扫描指定包中的类。该类使用 Spring 的类路径扫描来查找类。

import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AssignableTypeFilter;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class ClassScanner {
    public static String[] getClassesInPackage(String basePackage) {
        List<String> classNames = new ArrayList<>();
        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
        scanner.addIncludeFilter(new AssignableTypeFilter(Object.class));
        Set<BeanDefinition> components = scanner.findCandidateComponents(basePackage);
        for (BeanDefinition bd : components) {
            classNames.add(bd.getBeanClassName());
        }

        return classNames.toArray(new String[0]);
    }
}

第 3 步:使用 NamingConventionValidator

在 Spring Boot 应用程序的主类中NamingConventionValidator从 Spring 应用程序上下文获取 bean。然后,调用validateNamingConventions指定基础包的方法。

import jackynote.pro.config.NamingConventionValidator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class MainApplication {

    public static void main(String... args) {
        ConfigurableApplicationContext context = SpringApplication.run(MainApplication.classargs);
        NamingConventionValidator validator = context.getBean(NamingConventionValidator.class);
        String basePackage = "jackynote.pro"// Specify your base package here
        validator.validateNamingConventions(basePackage);
    }
}

第 4 步:运行应用程序

创建ProductService.java以检查验证器是否正常工作:

import org.springframework.stereotype.Service;

@Service
public class ProductService {

    public ProductService() { }

        // TODO - try with method name is not good
    public void AddProduct() {

    }
}

当您运行 Spring Boot 应用程序时,它将NamingConventionValidator扫描您的代码库,验证类和方法的命名约定,并将任何违规情况打印到控制台。

Exception in thread "main" jackynote.pro.config.NamingConventionViolationException: Method name violation in class jackynote.pro.service.ProductServiceAddProduct
    at jackynote.pro.config.NamingConventionValidator.validateNamingConventions(NamingConventionValidator.java:69)
    at jackynote.pro.MainApplication.main(MainApplication.java:15)

Java 反射对提升代码质量的好处

  • 一致性: 自动化确保命名约定和编码标准得到一致遵循,从而减少代码库中的混乱。
  • 早期检测: 一旦提交代码,就会检测到违反命名约定的行为,从而防止问题累积并变得更难以解决。
  • 提高代码质量: 强制命名约定提高了代码的可读性和可维护性,使代码更容易理解和修改。
  • 减少手动工作: 自动化减少了强制命名约定所需的手动工作,使开发人员能够专注于更关键的任务。

结论

在 Spring Boot 项目中,维护代码质量对于保证项目的可维护性和可扩展性至关重要。Java 反射提供了一个强大的工具,通过自动命名约定验证和遵守编码标准来提高代码质量。

通过使用NamingConventionValidator和 类扫描技术,您可以提高代码库的质量并促进开发团队内部的协作。使用 Java 反射自动执行代码质量检查是确保 Spring Boot 应用程序在发展过程中保持干净和一致的实用方法。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

来源:芋道源码

相关新闻

正在直播丨胃癌病友提高生活质量的重要打开方式直播预告丨胃癌病友提高生活质量的重要打开方式启明创投陈侃:以创新提高中国生物医药资产质量的认可度【高分论文深度解读】董波/陈凯/冷梁团队联手利用进化节点动物,探索胚胎早期发育调控机制的最新研究高等教育普及化后,如何保卫高等教育的质量?如果同行评而不审, 成果无人复制, 学术质量的黑洞会有多大?高质量的「大牛强推」如何get?策划推荐信,宜早不宜迟!意大利和中国考古团队对文化遗产保护和利用的贡献推荐:高质量的医学统计分析服务商业观察|打造有质量的低价,社区生鲜没有花活活动预告 | 意大利和中国考古团队对文化遗产保护和利用的贡献Amazon 这10款保健品你有试过吗?想提升生活质量的亲快收藏顶刊TPAMI 2024 | PERF:一张2D全景图可合成高质量的360度3D场景港中文(深圳)1v1科研-AI对于大学生学习效率与质量的影响研究|收获一作论文与导师推荐信!顶刊TPAMI 2024!PERF:一张2D全景图可合成高质量的360度3D场景这才是高质量的夏令营!体育竞技、创意手工、科技探索+顶级设施和后勤保障!就问还有谁?拍摄动机决定纪录片的质量复旦陈果:低质量的独处,不如高质量的社交外网爆火!斯坦福Essay课的质量太高了低质量的独处,不如高质量的社交我悠闲而很有质量的周末一天 + 近期的一些观察分析了 1.5 亿行代码发现:AI 编程助手降低代码质量制作人分享:七条原则,助你打造高质量的游戏运营活动!分析了1.5亿行代码发现:AI编程助手降低代码质量
logo
联系我们隐私协议©2024 bendi.news
Bendi新闻
Bendi.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Bendi.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。