butterknife是Android开发中应用非常广泛的一个库。butterknife库主要利用了Java中的注解功能,可以提高Android应用的开发效率,毕竟没几个人会喜欢写那种冗长乏味的页面布局、事件连接的代码。首先,还是给一个典型的butterknife使用代码:
@BindView(R.id.btn) TextView mBtn;
这两行代码,就实现了把布局文件与TextView连接起来的功能,看起来确实非常简单。那么这么方便的功能是如何实现的呢?首先,还是看一个简答的例子,代码如下:
SimpleAnnotation.java
package basicTest; import java.lang.annotation.*; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Retention(RUNTIME) @Target(FIELD) public @interface SimpleAnnotation { public int value(); }
Main.java
package basicTest; import java.lang.reflect.Field; public class Main { public static void main(String[] args) { trackAnnotation(Main.class); System.out.println("end"); } public static void trackAnnotation(Class<?> cl) { for(Field field:cl.getDeclaredFields()){ SimpleAnnotation info = field.getAnnotation(SimpleAnnotation.class); System.out.println(field); if(info != null) { System.out.println(info.value()); } else{ System.out.println("info is empty"); } } } @SimpleAnnotation(23) int value1; @SimpleAnnotation(24) int value2; }
运行结果
- int basicTest.Main.value1
- 23
- int basicTest.Main.value2
- 24
- end
从上面的例子可以看出,Annotation会在类中添加注解的消息,所以利用这些信息就可能实现butterknife的类似功能。当然这里的注解是Runtime时的,而butterknife使用的是Class级别的注解。周末花了半天时间,准备写出一个玩具版的butterknife,结果主体代码写的差不多时,却在调试的时候卡了壳,等有空再调了。
发表评论