资讯专栏INFORMATION COLUMN

分享代码片段:如何对自动生成的java代码做自动格式化,以达到接近手写的效果

lykops / 2570人阅读

摘要:原文链接如题,有的时候,我们会采用自动生成代码的方式来完成一些任务,比如根据业务数据自动生成调用的供用户下载使用这样自动生成的代码,如果未经格式化处理,基本上是不可读的正好,我们常用的,快捷键就能自动格式化代码那么,下面这段代码,就是将的这

原文链接:https://gist.github.com/pfmiles/653c8b59e795698c867d

如题,有的时候,我们会采用自动生成java代码的方式来完成一些任务,比如根据业务数据自动生成调用api的sdk供用户下载、使用;
这样自动生成的代码,如果未经格式化处理,基本上是不可读的;

正好,我们常用的eclipse,快捷键"ctrl + shift + F"就能自动格式化java代码;
那么,下面这段代码,就是将eclipse的这个功能模块给“抠”出来多带带调用,达到格式化java代码的目的:

package test;

import java.util.Map;

import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.formatter.CodeFormatter;
import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.text.edits.TextEdit;

/**
 * 调用eclipse jdt core对生成的java源码进行格式化
 * 
 * @author pf-miles 2014-4-16 下午2:48:29
 */
public class JavaCodeFormattingUtil {

    /**
     * 尝试对传入的JavaSourceFile格式化,此操作若成功则将改变传入对象的内容
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void tryFormat(JavaSourceFile src) {
        Map m = DefaultCodeFormatterConstants.getEclipseDefaultSettings();
        m.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_6);
        m.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_6);
        m.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_6);
        m.put(DefaultCodeFormatterConstants.FORMATTER_LINE_SPLIT, "160");
        m.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, JavaCore.SPACE);

        String code = null;
        IDocument doc = null;
        try {
            code = src.getCharContent(true).toString();
            CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(m);
            TextEdit textEdit = codeFormatter.format(CodeFormatter.K_UNKNOWN, code, 0, code.length(), 0, null);
            if (textEdit != null) {
                doc = new Document(code);
                textEdit.apply(doc);
                src.setCode(doc.get());
            }
        } catch (Exception e) {
            throw new RuntimeException("Error occured while formatting code: " + src.toUri(), e);
        }
    }
}

其中“code = src.getCharContent(true).toString();”这一行先不必关心"src"是个什么对象,那是我们自定义的东西,这里的重点只需要得到“code”,然后后面的操作完全是针对"code"这个string形式的java代码而做;

其中还能对格式化属性做一些配置, 如:
VERSION_1_6是指对应的java版本;
而DefaultCodeFormatterConstants.FORMATTER_LINE_SPLIT则指一行最多到多长就会自动换行;
DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR是说想要使用什么字符来做缩进,一般都选择空格或tab;
这些都可以根据需求随意调整;

当然,上述这些代码的运行,是需要依赖eclipse的格式化模块功能库的,这个库,目前没有统一的依赖地址;可以根据类名上网随便搜一个可用的maven仓库依赖即可

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64303.html

相关文章

  • Java - 收藏集 - 掘金

    摘要:强大的表单验证前端掘金支持非常强大的内置表单验证,以及。面向对象和面向过程的区别的种设计模式全解析后端掘金一设计模式的分类总体来说设计模式分为三大类创建型模式,共五种工厂方法模式抽象工厂模式单例模式建造者模式原型模式。 强大的 Angular 表单验证 - 前端 - 掘金Angular 支持非常强大的内置表单验证,maxlength、minlength、required 以及 patt...

    XiNGRZ 评论0 收藏0
  • 自动代码生成工具 Snips 开发实践

    摘要:今天我来和大家分享一下以及自动化生成工具的开发经验。代码生成工具接着讲讲代码生成工具,对于来讲,有官方的代码生成器,还有其他的同类开源项目比如。现有的代码生成器没有可以开箱即用的,都需要去进行不少的修改。 前言 在开发工作中,经常会遇到新产品、服务上线后,需要将其 API 编写不同语言的 SDK。但不同语言 SDK 中都有很大一部分内容是用来进行 API 的描述,而且这部分代码量是最大...

    only_do 评论0 收藏0
  • 自动代码生成工具 Snips 开发实践

    摘要:今天我来和大家分享一下以及自动化生成工具的开发经验。代码生成工具接着讲讲代码生成工具,对于来讲,有官方的代码生成器,还有其他的同类开源项目比如。现有的代码生成器没有可以开箱即用的,都需要去进行不少的修改。 前言 在开发工作中,经常会遇到新产品、服务上线后,需要将其 API 编写不同语言的 SDK。但不同语言 SDK 中都有很大一部分内容是用来进行 API 的描述,而且这部分代码量是最大...

    qc1iu 评论0 收藏0
  • 自动代码生成工具 Snips 开发实践

    摘要:今天我来和大家分享一下以及自动化生成工具的开发经验。代码生成工具接着讲讲代码生成工具,对于来讲,有官方的代码生成器,还有其他的同类开源项目比如。现有的代码生成器没有可以开箱即用的,都需要去进行不少的修改。 前言 在开发工作中,经常会遇到新产品、服务上线后,需要将其 API 编写不同语言的 SDK。但不同语言 SDK 中都有很大一部分内容是用来进行 API 的描述,而且这部分代码量是最大...

    pepperwang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<