一 简介
这几天看了一些第三方的IOC源码,我就自己把关键代码写出来了。比如ButterKnife他的注解是作用在编译时的,xutils的注解方法时通过动态代理加反射调用的
二 关键代码
//用来标记自定义注解的有效范围,这里是运行时
@Retention(RetentionPolicy.RUNTIME)
//指定用于修饰哪些程序元素,这里是成员变量
@Target(ElementType.FIELD)
public @interface ViewById {
int value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnClick {
int[] value();
}
public static void inject(final Activity activity) {
Field[] fields = activity.getClass().getDeclaredFields();
for (Field field : fields) {
//判断属性是否被指定的注解所修饰
if(field.isAnnotationPresent(ViewById.class)){
ViewById port = field.getAnnotation(ViewById.class);
try {
field.setAccessible(true);
field.set(activity,activity.findViewById(port.value()));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
Method[] methods = activity.getClass().getDeclaredMethods();
for (final Method method : methods) {
if(method.isAnnotationPresent(OnClick.class)){
method.setAccessible(true);
OnClick cllick = method.getAnnotation(OnClick.class);
for (int value : cllick.value()) {
activity.findViewById(value).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
method.invoke(activity,v);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
}
}
}
}