博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java注解基础与使用
阅读量:6278 次
发布时间:2019-06-22

本文共 3951 字,大约阅读时间需要 13 分钟。

什么是注解

注解是一种在类、方法、属性、参数、变量等代码中添加一些描述信息,这些数据可以通过反射来获取到,然后针对注解信息做相应操作

为什么要学习注解

  • 一些优秀的开源库如Dragger、Retrofit、Butter Knife等都大量使用了注解,理解注解有助于我们学习这些第三方开源库
  • android support-annotations库提供了大量注解如@NonNull、@IntgerRes、@Keep等,使用这些注解有助于我们优化代码,增加代码可读性的同性,也能减少错误

Java 元注解的简单说明

  • @Target 描述注解的作用区域,常见取值有(TYPE FIELD METHOD PARAMETER)等
  • @Retention 描述注解的生命周期
    SOURCE 只保留在源码中,如@SuppressWarning作用是在编译时抑制警告,不必写入到class中
    CLASS 编译后保留在class文件中,如butterknife框架@Bind 编译时会将注解写入class文件中
    RUNTIME 注解会在class字节文件中存在,在运行时可以通过反射获取到相应数据
  • @Document 说明该注解将被包含在javadoc中
  • @Inherited:说明子类可以继承父类中的该注解

自定义注解

借用别人的一个实例,根据类中注解创建数据库表结构:

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface DBTable {    public String name() default "";}复制代码
@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface SQLString {    int value() default 0;    String name() default "";    Constraints constraints() default @Constraints;}复制代码
@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Constraints {    boolean primaryKey() default false;    boolean allowNull() default true;    boolean unique() default false;}复制代码
@DBTable(name = "MEMBER")public class Member {    @SQLString(30) String firstName;    @SQLString(value = 30,constraints = @Constraints(primaryKey = true))    String handle;    static int memberCount;    public String getHandle() { return handle; }    public String getFirstName() { return firstName; }}复制代码
import java.util.List;import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.util.ArrayList;public class TableCreator {    public static void main(String[] args) throws Exception {        createTab(Member.class);    }    private static void createTab(Class
tabClass) { DBTable dbTable = tabClass.getAnnotation(DBTable.class); String tableName = dbTable.name(); //读取注解中表名 if (tableName.length() < 1) tableName = tabClass.getName().toUpperCase(); List
columnDefs = new ArrayList<>(); for (Field field : tabClass.getDeclaredFields()) { String columnName = null; Annotation[] anns = field.getDeclaredAnnotations(); //读取变量注解创建数据表字段 if(anns.length > 0) { if (anns[0] instanceof SQLString) { SQLString sString = (SQLString) anns[0]; if (sString.name().length() < 1) columnName = field.getName().toUpperCase(); else columnName = sString.name(); columnDefs.add(columnName + " VARCHAR(" + sString.value() + ")" + getConstraints(sString.constraints())); } } } StringBuilder createCommand = new StringBuilder("CREATE TABLE " + tableName + "("); for (String columnDef : columnDefs) createCommand.append("\n " + columnDef + ","); String tableCreate = createCommand.substring(0, createCommand.length() - 1) + ");"; System.out.println("Table Creation SQL for " + tabClass.getName() + " is :\n" + tableCreate); } private static String getConstraints(Constraints con) { String constraints = ""; if (!con.allowNull()) constraints += " NOT NULL"; if (con.primaryKey()) constraints += " PRIMARY KEY"; if (con.unique()) constraints += " UNIQUE"; return constraints; }}复制代码

使用android support-annotations中注解优化代码

  • Nullness注解: @Nullable @NonNull
  • 资源类注解:@StringRes @IdRes @ColorRes等
  • @Keep 保持某个类或者函数不被混淆
  • IntDef和StringDef注解
    我们出于性能考虑经常用整形代替枚举,假设创建内核时有以下三程类型,我们可以定义一个@CoreType的注解,这样初始化的时候传的不是这三个值,编译器就会报错
public static final int ANDROID_WEBVIEW = 0;    public static final int XWALK_WEBVIEW = 1;    public static final int TENCENT_WEBVIEW = 2;    @IntDef({ANDROID_WEBVIEW, XWALK_WEBVIEW, TENCENT_WEBVIEW})    private  @interface CoreType{}         public  void init(Context context, @CoreType int coreType) {        mCoreType = coreType    }复制代码

转载地址:http://hjfva.baihongyu.com/

你可能感兴趣的文章
Web基础架构:负载均衡和LVS
查看>>
Linux下c/c++相对路径动态库的生成与使用
查看>>
SHELL实现跳板机,只允许用户执行少量允许的命令
查看>>
SpringBoot 整合Redis
查看>>
2014上半年大片早知道
查看>>
Android 6.0指纹识别App开发案例
查看>>
正文提取算法
查看>>
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>