同时发表在: http://blog.houzhi.me/2016/11/05/hugo-sourcecode-analysis
Hugo是JakeWharton大神开发的一个通过注解触发的Debug日志库。它是一个非常好的AOP框架,在Debug模式下,Hugo利用aspectj库来进行切面编程,插入日志代码。通过分析Hugo的代码能够对gradle以及aspectj有一个非常好的了解。
使用示例
通过使用来看Hugo具体的功能,这样也能够更好的明白Hugo的实现方式。
首先把下面的编译配置文件添加到项目当中:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
}
}
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'
使用的时候直接使用@DebugLog注解给想要调试的方法就好了,它会打印函数的参数,执行时间,以及返回值:
@DebugLog
public String getName(String first, String last) {
SystemClock.sleep(15); // Don't ever really do this!
return first + " " + last;
}
输出:
V/Example: ⇢ getName(first="Jake", last="Wharton")
V/Example: ⇠ getName [16ms] = "Jake Wharton"
需要指出的,Hugo只会在Debug模式下打印log。DebugLog的源码如下:
package hugo.weaving;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.CLASS;
@Target({TYPE, METHOD, CONSTRUCTOR}) @Retention(CLASS)
public @interface DebugLog {
}
就是注解,Target也包含了TYPE,DebugLog也可以添加到类上面:
@DebugLog
static class Greeter {
private final String name;
Greeter(String name) {
this.name = name;
}
private String sayHello() {
return "Hello, " + name;
}
}
AspectJ
AspectJ是一个面向切面的框架,它有一个专门的编译器用来生成遵守Java字节编码规范的class文件。在这里下载安装,实际上它有自己的语法。看个简单的例子:
// 我们有一个TestService类,TestService.java
public class TestService{
public void test(){
System.out.println("test");
}
public