专栏首页jianhuicodeAndroid注解学习(2)

Android注解学习(2)

    最近考试周没什么时间写,回归正题。前面的一次简单的讲了关于注解的的基础部分,这一次分析xutils注解封装的源码(奉上github源码)。

    补充下:xUtils 2.x对Android 6.0兼容不是很好, 请尽快升级至xUtils3。(如网络部分:android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类))

   (1) 注解模块目录结构

 (2) 分析源代码

  1.元注解--annoation文件夹下三个注解

ContentView:对于activity设置布局文件

/*
 * Copyright (c) 2013. wyouflf (wyouflf@gmail.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.xutils.view.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)//使用范围--类,接口,枚举,Annotation类型
@Retention(RetentionPolicy.RUNTIME)//有效范围--运行时有效
public @interface ContentView {
    int value();//布局资源
}

Event:

package org.xutils.view.annotation;

import android.view.View;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 事件注解.
 * 被注解的方法必须具备一下形式:
 * 1. private 修饰
 * 2. 返回值类型没有要求
 * 3. 方法名以Click或Event结尾, 否则可能被混淆编译时删除. (方法签名形式为void *(android.view.View)也可以)
 * 4. 参数签名和type的接口要求的参数签名一致.
 * Author: wyouflf
 * Date: 13-9-9
 * Time: 下午12:43
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Event {

    /**
     * 控件的id集合, id小于1时不执行ui事件绑定.
     *
     * @return
     */
    int[] value();

    /**
     * 控件的parent控件的id集合, 组合为(value[i], parentId[i] or 0).
     *
     * @return
     */
    int[] parentId() default 0;

    /**
     * 事件的listener, 默认为点击事件.
     *
     * @return
     */
    Class<?> type() default View.OnClickListener.class;

    /**
     * 事件的setter方法名, 默认为set+type#simpleName.
     *
     * @return
     */
    String setter() default "";

    /**
     * 如果type的接口类型提供多个方法, 需要使用此参数指定方法名.
     *
     * @return
     */
    String method() default "";
}

ViewInject:绑定控件id

/*
 * Copyright (c) 2013. wyouflf (wyouflf@gmail.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.xutils.view.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)//字段
@Retention(RetentionPolicy.RUNTIME)//运行时有效
public @interface ViewInject {

    int value();//绑定控件id

    /* parent view id */
    int parentId() default 0;//绑定控件父布局id 默认是取0
}

2.View文件夹下4个类

ViewInfo--1.控件注解生成ViewInfo;          2.对于散列集合包括HashSet、HashMap以及HashTable通过先比较hashcode相等再比较equals来提高效率
package org.xutils.view;

/**
 * 比较两个ViewInfo是否相等
 * Author: wyouflf
 * Date: 13-12-5
 * Time: 下午11:25
 */
/*package*/ final class ViewInfo {
    public Object value;
    public int parentId;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof ViewInfo)) return false;

        ViewInfo that = (ViewInfo) o;

        if (parentId != that.parentId) return false;
        if (value == null) return (null == that.value);

        return value.equals(that.value);
    }

    @Override
    public int hashCode() {
        int result = value.hashCode();
        result = 31 * result + parentId;
        return result;
    }
}

 ViewInjector--定义注解绑定的接口不再详细贴了

 ViewInjectorImpl(重点)--实现注解绑定接口的实现类(包括控件绑定,布局资源绑定,控件的事件绑定)

 使用单例模式双重检查锁定创建ViewInjectorImpl对象并保证线程安全

 简单的做了ViewInjectorImpl类的分析:

错误之处还请指出-_-。。。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android注解学习(2)

        最近考试周没什么时间写,回归正题。前面的一次简单的讲了关于注解的的基础部分,这一次分析xutils注解封装的源码(奉上github源码)。     补充...

    用户1148881
  • 420小时学习代码之后:如何教你免费自学Python

    用户1148881
  • Android Studio 错误集

    错误列表与解决方案: 1.Android studio Gradle project sync failed Android studio 构建项目出错 Err...

    用户1148881
  • Android注解学习(2)

        最近考试周没什么时间写,回归正题。前面的一次简单的讲了关于注解的的基础部分,这一次分析xutils注解封装的源码(奉上github源码)。     补充...

    用户1148881
  • 《Springboot极简教程》使用@SpringBootApplication annotation

    许多Spring Boot开发人员总是使用@Configuration,@EnableAutoConfiguration和@ComponentScan来标注它们...

    一个会写诗的程序员
  • SrpingCloud ---github上面如何使用webHook实现配置文件修改 ,客户端自动刷新

    增加了spring-boot-starter-actuator包,spring-boot-starter-actuator是一套监控的功能,可以监控程序在运行时...

    爱明依
  • java之异步线程Executor

    说起异步,下意识就想到同步,这两个概念每个人都有着不同的理解,在这我们只是提下这关键词,具体的理解,可自行斟酌。

    码农王同学
  • 一步步完成Maven+SpringMVC+SpringFox+Swagger整合示例

    本文给出一个整合Maven+SpringMVC+SpringFOX+Swagger的示例,并且一步步给出完成步骤。

    孟君
  • Spring Boot入门系列(九)如何实现异步执行任务,极简版!

    今天主要讲解Spring Boot中的另外一个任务:异步任务。所谓异步任务,其实就是异步执行程序,有些时候遇到一些耗时的的任务,如果一直卡等待,肯定会影响其他程...

    架构师精进
  • uNetXST:将多个车载摄像头转换为鸟瞰图语义分割图像

    项目地址:https://github.com/ika-rwth-aachen/Cam2BEV

    3D视觉工坊

扫码关注云+社区

领取腾讯云代金券