Java代码可视化之路#1
2016-05-17 23:25
447 查看
Inspired by codeviz
作为一个有理想的程序猿,阅读一些优秀的代码是一种自我修养。而优秀的代码,在我看来,应该会是一篇优美的文章,段落结构简单清晰,具体反应到代码上,应该是大部分逻辑只要通过方法名,方法调用关系就足以理清。而反过来,这也是检验代码质量的一大利器(当然,不是绝对标准)。
于是,我的初步想法(以后应该会做得更多^_^),有一个工具可以将我们要进行阅读的代码进行可视化,类似codeviz所能提供的功能,但是需要做得更多一些。目前已经实现的,1.0版本,可以对class的每一个
需要保证我们要可视化的代码,即
举个栗子来看,
所生成的
表示说,第14行的代码调用了
如果我们对JDK的代码也做了可视化的处理,就可以再超链接点过去看看
首先,需要将我们的代码install到本地仓库。只要执行
其次,修改需要可视化的maven项目的pom文件。需要将第一步install的包添加到依赖里面,
并且增加
最后,对项目执行
后面会写个脚本来将这三步全部自动化做掉的。
方法过滤
代码嵌入?
kindle阅读?
路漫漫其修远兮。。。
这是个什么项目
已经忘记是什么时候知道了codeviz这么个东东,忘记是什么时候开始有这样一个想法,想要针对Java做一些代码可视化的工作,于是便有了codeviz4j这样一个项目。作为一个有理想的程序猿,阅读一些优秀的代码是一种自我修养。而优秀的代码,在我看来,应该会是一篇优美的文章,段落结构简单清晰,具体反应到代码上,应该是大部分逻辑只要通过方法名,方法调用关系就足以理清。而反过来,这也是检验代码质量的一大利器(当然,不是绝对标准)。
于是,我的初步想法(以后应该会做得更多^_^),有一个工具可以将我们要进行阅读的代码进行可视化,类似codeviz所能提供的功能,但是需要做得更多一些。目前已经实现的,1.0版本,可以对class的每一个
方法生成一个html文件,其中的内容就是这个方法所调用的其他方法,并且超链接到这些被调用的方法,这样就可以看到这些被调用的方法本身又调用了哪些其他的方法。
1.0版本简介
前面说了那么多,现在我们还是直接来看下代码吧。git clone项目代码之后,来看我们的测试用例,
me.kisimple.codeviz4j.launch.Main,
public class Main { private static final String[] ARGUMENTS = new String[] { "-proc:only", "-processor", "me.kisimple.codeviz4j.processor.MethodInvocationProcessor", "me/kisimple/codeviz4j/buuug/v1/i001/StaticClazz.java", "me/kisimple/codeviz4j/buuug/v1/i002/GenericMethod.java", "me/kisimple/codeviz4j/buuug/v1/i003/AnonymousClazz.java", "me/kisimple/codeviz4j/buuug/v1/i004/InnerClazz.java", }; public static void main(String[] args) { System.out.println(System.getProperty("user.dir")); // setUserDir(); com.sun.tools.javac.main.Main compiler = new com.sun.tools.javac.main.Main("javac"); compiler.compile(ARGUMENTS); } }
需要保证我们要可视化的代码,即
me/kisimple/codeviz4j/buuug/v1/i001/StaticClazz.java等,是在
user.dir目录下,并且在classpath上能找到
MethodInvocationProcessor。执行成功之后,在
user.home目录下会多出一个codeviz4j的目录,该目录的内容如下,
blues@ubuntu:~$ tree codeviz4j codeviz4j ├── error.log └── me └── kisimple └── codeviz4j └── buuug └── v1 ├── i001 │ └── StaticClazz │ ├── main(java.lang.String[]).html │ ├── saySomething().html │ ├── StaticClazz().html │ └── _static.html ├── i002 │ └── GenericMethod │ ├── GenericMethod().html │ ├── main(java.lang.String[]).html │ ├── rockNroll(E).html │ ├── rockNroll(java.util.Map,java.util.Map).html │ ├── rockNroll(T).html │ └── _static.html ├── i003 │ ├── AnonymousClazz │ │ ├── AnonymousClazz().html │ │ ├── main(java.lang.String[]).html │ │ └── _static.html │ ├── AnonymousClazz$1 │ │ ├── ().html │ │ ├── saySomething().html │ │ └── _static.html │ └── AnonymousClazz$2 │ ├── ().html │ ├── saySomething().html │ └── _static.html └── i004 ├── InnerClazz │ ├── InnerClazz().html │ ├── main(java.lang.String[]).html │ ├── PrivateInnerClazz │ │ ├── PrivateInnerClazz().html │ │ ├── saySomething().html │ │ └── _static.html │ ├── PublicInnerClazz │ │ ├── PublicInnerClazz().html │ │ ├── saySomething().html │ │ └── _static.html │ ├── _static.html │ └── StaticInnerClazz │ ├── saySomething(int).html │ ├── _static.html │ └── StaticInnerClazz().html └── InnerClazz$1LocalClass ├── LocalClass().html ├── saySomething().html └── _static.html
举个栗子来看,
StaticClazz,
public class StaticClazz { public static boolean saySomething() { System.out.println("hello world!"); return true; } public static void main(String[] args) { saySomething(); } }
所生成的
main方法的html文件,内容如下,
14: <a href="file:////home/blues/codeviz4j/me/kisimple/codeviz4j/buuug/v1/i001/StaticClazz/saySomething().html" target=_blank>me.kisimple.codeviz4j.buuug.v1.i001.StaticClazz#saySomething</a><br/>
表示说,第14行的代码调用了
saySomething方法,该方法的html内容如下,
9: <a href="file:////home/blues/codeviz4j/java/io/PrintStream/println(java.lang.String).html" target=_blank>java.io.PrintStream#println</a><br/>
如果我们对JDK的代码也做了可视化的处理,就可以再超链接点过去看看
println调用了哪些方法了^_^。
maven支持
考虑到现如今大部分Java项目都是使用maven来管理,于是便做了maven项目的支持。暂时还有点麻烦,分三步:首先,需要将我们的代码install到本地仓库。只要执行
bin目录下的
install脚本就可以了。需要保证已经配置了环境变量
JAVA_HOME。
其次,修改需要可视化的maven项目的pom文件。需要将第一步install的包添加到依赖里面,
<dependency> <groupId>me.kisimple</groupId> <artifactId>codeviz4j</artifactId> <version>1.0.0-SNAPSHOT</version> <scope>compile</scope> </dependency>
并且增加
maven-compiler-plugin插件的配置,
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version><!-- 不确定最低支持到哪个版本额 --> <configuration> <source>${java.version}</source><!-- 具体看源码用的是哪个版本 --> <target>1.7</target> <proc>only</proc> <annotationProcessors> <annotationProcessor> me.kisimple.codeviz4j.processor.MethodInvocationProcessor </annotationProcessor> </annotationProcessors> </configuration> </plugin>
最后,对项目执行
mvn compile就可以了。
后面会写个脚本来将这三步全部自动化做掉的。
Issues
目前已知有一个比较大的问题,是在跑了几个比较大的maven项目之后发现的,因为涉及到很具体的实现细节,在这里就不细说了,后面准备好好读读javac的源码来看看问题出在哪了,怎么解决,也希望有感兴趣的同学,或者熟悉
javac源码的大大可以加入到项目里来,也算得上是件好玩的事吧^_^
TODO
图形化方法过滤
代码嵌入?
kindle阅读?
路漫漫其修远兮。。。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树