尝试从java源文件中解析出类、方法、属性等信息,但下面的代码没有完全实现。

Sub parseJava()
Dim package_name as String
'read a file
Documents.Open FileName:="f:\CommandCm.java", ConfirmConversions:=False, ReadOnly:=True
paraNo = ActiveDocument.Paragraphs.Count
For lineNo = 1 To paraNo
Set curParaWords = ActiveDocument.Paragraphs(lineNo).Range.Words
Dim strCurPara as String
strCurPara = ActiveDocument.Paragraphs(lineNo).Range.Text
If InStr(strCurPara, "package")=1 Then
'包名是package后、分号前的部分
tmpStr = Right(strCurPara,Len(strCurPara)-Len("package")-1)
package_name = Left(tmpStr, Len(tmpStr)-2)
End If
If InStr(strCurPara, "public class")=1 Then
'类名是这一行的第三个单词,且不含末尾空格
class_name = RTrim(curParaWords(3).Text)
End If
If InStr(strCurPara, "public interface")=1 Then
'接口名是这一行的第三个单词,且不含末尾空格
class_name = RTrim(curParaWords(3).Text)
End If
Select Case curParaWords(2).Text
Case "public"

Case "private"
Case "protected"
Case Else
End Case
If curParaWords(2)="public" Then
'接口名是这一行的第三个单词,且不含末尾空格
class_name = RTrim(ActiveDocument.Paragraphs(lineNo).Range.Words(3).Text)
End If
Next lineNo
ActiveDocument.Close
End Sub

下面是业务逻辑:

数据结构:

类相关数据表ClassInfo(Map)

key: name, description, class_name, package, extends, interface;

属性数据表PropInfo(List)

方法数据表MethodInfo(List)

文本格式约定:

顶格、package起首代码行为package声明行;

顶格、public class起首的代码行是类声明行;

顶格、 public interface起首的代码行是接口声明行;

一个tab后跟public、private、protected是方法或者属性

有左括号的是方法, 左括号前单词是方法名,方法名前是返回值的数据类型;

无左括号 的是 属性,等号左边单词是属性名,若无等号分号前单词是属性名,若都没有输出一条 “文件名:行号:异常属性/方法,手工提取” 提示;

一个tab后跟其他字母 输出一条“文件名:行号:异常属性/方法,手工提取”提示;

一个tab后跟非字母符号(如/*是注释,@是编译标志)略过;

流程:

用户输入目标目录

将文件名保存在ClassInfo.name和class_name中;

加载该目录下所有java文件, 对于一个java文件:

第一次文本逐行读取:提取除方法/属性说明外所有信息;

第二次文本逐行读取:寻找以“* 方法名”开始的行,作为方法说明,放入对应的方法Map中;

解析java源文件的更多相关文章

  1. 深入解析java虚拟机-jvm运行机制

    转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...

  2. 深入解析java乱码

    1.什么是编码 ,为什么要编码 先前从没有思考这么深入的问题,觉得一切理所当然,直到有一天java的乱码让我跪了,他不在听我的话,到处是乱码,这次我不打算放过它,我要收拾了它. 大家都知道,文本文件, ...

  3. 使用JDT.AST解析java源码

    在做java源码的静态代码审计时,最基础的就是对java文件进行解析,从而获取到此java文件的相关信息: 在java文件中所存在的东西很多,很复杂,难以用相关的正则表达式去一一匹配.但是,eclip ...

  4. 【JVM系列】一步步解析java执行内幕

    对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式.在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产品,在整个过 ...

  5. 【java】解析java类加载与反射机制

    目录结构: contents structure [+] 类的加载.连接和初始化 类的加载 类的连接 类的初始化 类加载器 类加载器机制 自定义类加载器 URLClassLoader类 反射的常规操作 ...

  6. 自己挖的坑跪着也要填完---mapper配置文件和java源文件在同一包下

    本来准备研究下mybatis源码执行流程的,就随意搭建了个项目,所有配置如下: 一切看似都是那么的正常,然而执行的时候:Exception in thread "main" org ...

  7. 一个java源文件中为什么只能有一个public类。

    我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个publi ...

  8. Java源文件编译成功但是运行时加载不到文件

    最近系统重装了一些,Java等环境变量都需要重新配置,配置好以后编写了一个Java源文件编译了一下,通过Javac编译源文件,编译成功,但是再通过Java运行时没找到报出找不到加载文件或者加载文件不存 ...

  9. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

随机推荐

  1. CRM的职能和主要构成模块探索

    CRM客户管理系统是随着互联网的快速发展和信息技术的进步而发展起来的,是企业管理客户关系.优化业务流程的首选.客户关系管理可以存储企业获得的客户信息,方便业务人员随时查看和了解客户需求:客户关系管理可 ...

  2. 230th Weekly Leetcode Contest

    题目二 题目描述 5690. 最接近目标价格的甜点成本  难度:中等-中等 题解 解法一:三进制状态压缩 考虑到baseCosts.toppingCosts的长度最多都为10,每一种辅料都有加0.1. ...

  3. Java中有趣的移位操作!彻底弄懂各个移位操作符的使用方式

    << <<: 左移运算,左移几位就补几个0 >> >>: 右移运算,为算术右移 如果数字为正数时,移位后在前面补0 如果数字为负数时,移位后在前面补1 ...

  4. docker安装和配置nginx

    配置nginx docker配置nginx 本机ip是192.168.0.200 docker pull nginx 配置nginx主机 vi /root/docker/nginx/nginx01.c ...

  5. 『心善渊』Selenium3.0基础 — 28、unittest中测试套件的使用

    目录 1.测试套件的作用 2.使用测试套件 (1)入门示例 (2)根据不同的条件加载测试用例(了解) (3)常用方式(推荐) 1.测试套件的作用 在我们实际工作,使用unittest框架会有两个问题: ...

  6. Djiango 连接数据库mysql 的基本数据操作

    1.单表操作 (1) .增加操作 1 # 增加操作 2 def add_person(request): 3 # 1.使用save() 方法 4 # person_obj = models.Perso ...

  7. window下玩转maven私服全流程,融合创建仓库、上传项目资源、下载私服资源

    ​ 在互联网项目开发浪潮中,maven成为了项目管理依赖的重要工具,更多时候maven只作为拉取外部依赖的手段.但出于安全的考虑的,部门企业难免封装一些私有的工具类,或开源框架的二次开发封装,mave ...

  8. c语言:scanf(" %c",&bla); scanf("%c",&bla); 语句差别

    %前有空格,%没有空格 scanf("%c",&c) 与 scanf(" %c",&c),后者只是在%前多了个空格,似乎没有什么区别,但使用起来 ...

  9. python all any函数(相反)

    ''' all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False. 元素除了是 0.空.FALSE 外都算 TRUE. 语 ...

  10. Java基础00-异常25

    1. 异常 异常 1.1 异常概述 1.2 JVM的默认处理方案 有一行代码报错,下面的代码就不会执行. 1.3 异常处理 如果程序出现了异常,需要我们自己来处理,因为在实际的开发中,不能因为一处的报 ...