您的位置:首页 > 编程语言 > Java开发

Java代码可视化之路#1

2016-05-17 23:25 447 查看
Inspired by codeviz

这是个什么项目

已经忘记是什么时候知道了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 可视化