使用JDT核心库解析JDK源码后初步分析API命名

简介: 使用Eclipse的JDT核心库, 对JDK源码进行语法分析, 提取API包括类/方法/方法参数, 对其命名进行初步分析. Analyze JDK source code using JDT core library, get the naming of the classes and public...

源自术语词典API项目 · Issue #85 · program-in-chinese/overview, 打算先用早先的代码提取JDK API中的类/方法/参数名, 看看有哪些词需要翻译.

源码在program-in-chinese/programming_term_dictionary

类型名提取器.java 扩展了语法树遍历器, 对公开(public)的类型/方法/参数进行保存:

public class 类型名提取器 extends ASTVisitor {

  private 类型名 名 = new 类型名();
  
  private String 当前类名 = "";

  @Override
  public boolean visit(MethodDeclaration 方法节点) {
    String 当前方法名 = 方法节点.getName().getFullyQualifiedName();
    if (为公开声明(方法节点)) {
      名.方法名.put(当前方法名, 当前类名);
    }

    for (Object 参数 : 方法节点.parameters()) {
      VariableDeclaration 变量声明 = (VariableDeclaration) 参数;
      String 参数名 = 变量声明.getName().getFullyQualifiedName();

      // 忽略所有单字母参数名. TODO: 是否需要研究单字母命名?
      if (参数名.length() > 1) {
        名.参数名.put(参数名, 当前类名 + "." + 当前方法名);
      }
    }
    return super.visit(方法节点);
  }

  @Override
  public boolean visit(TypeDeclaration 类型节点) {
    if (为公开声明(类型节点)) {

      // TODO: 取完整类名(包括包名)
      当前类名 = 类型节点.getName().getFullyQualifiedName();
      名.类名.put(类型节点.getName().getFullyQualifiedName(), 当前类名);
    }
    return super.visit(类型节点);
  }

  public 类型名 获取名() {
    return 名;
  }

  private boolean 为公开声明(BodyDeclaration 节点) {
    return (节点.getModifiers() & Modifier.PUBLIC) != 0;
  }

  public class 类型名 {
    public Map<String, String> 类名 = new HashMap<>();
    public Map<String, String> 方法名 = new HashMap<>();
    public Map<String, String> 参数名 = new HashMap<>();
  }
}

遍历JDK类型名.java 暂时只对util部分进行分析

public class 遍历JDK类型名 {

  private static final ASTParser 语法解析器 = ASTParser.newParser(AST.JLS8);

  // JDK源码内路径
  private static final String 常量_源文件路径 = "java/util";
  private static final String 常量_输出文件路径 = "命名列表/";

  private static final 类型名提取器 提取器 = new 类型名提取器();

  /**
   * 
   * @param 参数 第一个参数为JDK路径。可由JDK目录下的src.zip解压。
   * @throws Exception
   */
  public static void main(String[] 参数) throws Exception {
    if (参数.length != 1) {
      System.out.println("需要JDK源码路径作为唯一参数");
      return;
    }

    文件功用.创建路径(常量_输出文件路径);
    处理Java文件(new File(参数[0] + 常量_源文件路径));

    类型名 名 = 提取器.获取名();

    // 从方法列表中删除所有构造方法
    for (String 类名 : 名.类名.keySet()) {
      名.方法名.remove(类名);
    }

    String 后缀 = "_" + 常量_源文件路径.replaceAll("/", "_");
    文件功用.写行入文件(名.类名, 常量_输出文件路径 + "类" + 后缀 + ".txt");
    文件功用.写行入文件(名.方法名, 常量_输出文件路径 + "方法" + 后缀 + ".txt");
    文件功用.写行入文件(名.参数名, 常量_输出文件路径 + "参数" + 后缀 + ".txt");
    System.out.println("提取完毕: " + 名.类名.size() + "类;" + 名.方法名.size() + "方法;" + 名.参数名.size() + "参数");
  }

  private static void 处理Java文件(File 路径) throws Exception {
    if (路径.isFile()) {
      if (路径.getName().endsWith(".java")) {
        解析Java文件(路径);
      }
    } else {
      File[] 文件 = 路径.listFiles();
      if (文件 != null) {
        for (File 某文件 : 文件) {
          处理Java文件(某文件);
        }
      }
    }
  }

  private static void 解析Java文件(File 文件) throws Exception {
    语法解析器.setSource(文件功用.取源文件文本(文件).toCharArray());
    语法解析器.createAST(null).accept(提取器);
  }
}

初步统计:

提取完毕: 332类;1172方法;449参数

按照骆驼命名对提取出的命名进行单词拆分后, 得到902个单词, 其中有不少同根词, 如:

sequence
sequential
split
splittable
token
tokenizer
word
words
write
writer
zone
zoned

还有不少不明所以的:

csn
em
fd

接下去将拆分出的单词与源API联系起来, 以便翻译时结合原API语义(已更新上面的源码). 比如csn来源于java.util.Formatter.Formatter(String fileName, String csn, Locale l), javadoc中意为The name of a supported {@linkplain java.nio.charset.Charset charset}. 真猜不到.

顺便对所有java/下的源码进行统计:

1579类;5093方法;2022参数
2752个单词

5倍左右数量的API但单词数只有3倍, 看来复用率蛮高. 总单词表在.

2018-08-27

相关文章
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1136 29
|
12月前
|
数据采集 前端开发 JavaScript
金融数据分析:解析JavaScript渲染的隐藏表格
本文详解了如何使用Python与Selenium结合代理IP技术,从金融网站(如东方财富网)抓取由JavaScript渲染的隐藏表格数据。内容涵盖环境搭建、代理配置、模拟用户行为、数据解析与分析等关键步骤。通过设置Cookie和User-Agent,突破反爬机制;借助Selenium等待页面渲染,精准定位动态数据。同时,提供了常见错误解决方案及延伸练习,帮助读者掌握金融数据采集的核心技能,为投资决策提供支持。注意规避动态加载、代理验证及元素定位等潜在陷阱,确保数据抓取高效稳定。
388 17
|
存储 API 文件存储
单页图床HTML源码+本地API接口图床系统源码
图床系统是一种用于存储和管理图片文件的在线服务。它允许用户上传图片文件,并生成相应的图片链接,从而方便用户在网页、社交媒体或其他平台上分享图片。
529 2
单页图床HTML源码+本地API接口图床系统源码
|
12月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
482 4
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
3427 1
|
缓存 监控 搜索推荐
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS