解析java源文件
尝试从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源文件的更多相关文章
- 深入解析java虚拟机-jvm运行机制
转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...
- 深入解析java乱码
1.什么是编码 ,为什么要编码 先前从没有思考这么深入的问题,觉得一切理所当然,直到有一天java的乱码让我跪了,他不在听我的话,到处是乱码,这次我不打算放过它,我要收拾了它. 大家都知道,文本文件, ...
- 使用JDT.AST解析java源码
在做java源码的静态代码审计时,最基础的就是对java文件进行解析,从而获取到此java文件的相关信息: 在java文件中所存在的东西很多,很复杂,难以用相关的正则表达式去一一匹配.但是,eclip ...
- 【JVM系列】一步步解析java执行内幕
对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式.在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产品,在整个过 ...
- 【java】解析java类加载与反射机制
目录结构: contents structure [+] 类的加载.连接和初始化 类的加载 类的连接 类的初始化 类加载器 类加载器机制 自定义类加载器 URLClassLoader类 反射的常规操作 ...
- 自己挖的坑跪着也要填完---mapper配置文件和java源文件在同一包下
本来准备研究下mybatis源码执行流程的,就随意搭建了个项目,所有配置如下: 一切看似都是那么的正常,然而执行的时候:Exception in thread "main" org ...
- 一个java源文件中为什么只能有一个public类。
我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个publi ...
- Java源文件编译成功但是运行时加载不到文件
最近系统重装了一些,Java等环境变量都需要重新配置,配置好以后编写了一个Java源文件编译了一下,通过Javac编译源文件,编译成功,但是再通过Java运行时没找到报出找不到加载文件或者加载文件不存 ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
随机推荐
- JavaWeb入门知识梳理
万维网 Web App(Web应用程序)是一种可以通过万维网访问的应用程序,用户只需要连接互联网和计算机安装浏览器,即可通过URI在线使用某个Web App,而不需要再安装客户端到计算机上.Web A ...
- 大话Java代理模式
一.什么是代理 首先理解一下什么是代理.简单来说,代理就你要做一件事情,我替你把事情做了.这是现实生活中我们遇到的代理的需求场景.但写代码的时候对代理场景的需求,跟现实场景有点区别,本质上还是帮你做事 ...
- PHP严格类型检查模式
前言 PHP默认情况下是弱类型校验模式,在php7下declare新增了strict_types指令,通过设置strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句 ...
- 大数据-Hadoop 伪分布模式
1. 分析 (1)配置集群 (2)启动.测试集群增.删.查 (3)执行WordCount案例 2. 执行步骤 (1)配置集群 (a)配置:hadoop-env.sh Linux系统中获取JDK的安装路 ...
- XCTF WEB backup
不用多说,肯定是扫描后台,目录看看能不能找到备份文件,(可恶我的御剑的字典太菜了,居然爆破不出来),建议大家装御剑高一些的版本,或者用dirsearch来扫描,都是不错的. 这里插个知识点,备份文件常 ...
- HCNA Routing&Switching之动态路由协议OSPF基础(一)
前文我们了解了基于路径矢量算法的动态路由协议RIP防环以及度量值的修改相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15012895.html:今天我 ...
- Oracle-索引分裂研究
目录 索引分裂介绍 分类 索引分裂实验 基础环境准备 基础信息统计--之前 数据插入 基础信息统计--之后 Trace 数据统计 数据分析 索引PRI_ID之dba_extents视图 索引PRI_I ...
- [刘阳Java]_第一个Java程序_第7讲
1. 其实第一个Java程序是很简单,但是当自己编写第一个Java程序时候需要注意如下几个内容: 理解Java程序的运行环境 校验你的Java环境变量是否能够运行你所写的第一个Java程序 理解Jav ...
- 【Mysql】InnoDB 引擎中的数据页结构
InnoDB 是 mysql 的默认引擎,也是我们最常用的,所以基于 InnoDB,学习页结构.而学习页结构,是为了更好的学习索引. 一.页的简介 页是 InnoDB 管理存储空间的基本单位,一个页的 ...
- 创建Rdemo项目
1.创建项目工作目录 mkdir /home/sesa464509/R/demo cd /home/sesa464509/R/demo vi sayHello.R ------------------ ...