美文网首页
java注解

java注解

作者: 游侠_6fb7 | 来源:发表于2020-04-16 19:03 被阅读0次

Annotation(注解)是JDK1.5及以后版本引入,目前大部分框架(如Spring,Android ButterKnife,OrmLite,Retrofit等)都使用了注解简化代码并提高编码的效率。
Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用

元注解

元注解的作用就是负责注解其他注解。Java5.0定义了4个标准meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:

  1. @Target,用来约束注解可以应用的地方(如方法、类或字段),其中ElementType是枚举类型  当注解未指定Target值时,则此注解可以用于任何元素之上,多个值使用{}包含并用逗号隔开,如下:
       @Target(value={ElementType.CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
  1. @Retention,定义该注解的生命周期。
    RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override,@SuppressWarnings都属于这类注解。
    RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
    RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
  2. @Documented,一个简单的Annotations标记注解,表示是否将注解信息添加在java文档中。
  3. @Inherited,定义该注释和子类的关系
实例
image.png
注解model
image.png
获取注解
image.png
生成sql语句
CREATE TABLE IF NOT EXISTS CustomTable(UserCustomList BLOB ,datatype INTEGER ,resverT TEXT
获取注解的过程中用反射机制。如果你熟悉反射代码,就会知道反射可以提供类名、方法和实例变量对象。所有这些对象都有getAnnotation()这个方法用来返回注解信息。我们需要把这个对象转换为我们自定义的注释(使用 instanceOf()检查之后),同时也可以调用自定义注释里面的方法
  1. 获取方法中参数注解


    image.png
    image.png
    image.png
  2. 编译时注解
    自定义注解,实现findViewById
package com.xxx.app.utils.annotions;

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

/**
 * Created by on 2017/4/27.
 * model转换
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ColumnsName {
    String fieldName() default "";
}

package com.xxx.app.utils.annotions;

import com.xxx.app.common.log.LogUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by on 2017/4/28.
 * 反射工具类
 * 目前主要提供model转换
 */
public class ReflectUtils {

    private static final String TAG = ReflectUtils.class.getSimpleName();


    /**
     * 两个不同类型的 通过注解赋值
     * origin 中有注解的属性值 拷贝到destination中
     *
     * @param destination 目标model
     * @param origin      数据源model  注解名称和destination中的字段一致
     * @param <T>
     * @return 是否有赋值失败
     */
    /**
     * 两个不同类型的
     *
     * @param destination
     * @param origin
     * @param <T>
     */
    public static <T> boolean mergeAnnotion2Object(T destination, T origin) {
        boolean isSuccess = true;
        if (origin == null || destination == null)
            return false;
        List<Field> originList = getDeclaredFields(origin);
        List<Field> desList = getDeclaredFields(destination);
        for (Field originField : originList) {
            for (Field desField : desList) {
                ColumnsName annotation = originField.getAnnotation(ColumnsName.class);
                if (desField.getName().equals(originField.getName())
                        || (annotation != null && desField.getName().equals(annotation.fieldName()))) {
                    try {
                        desField.setAccessible(true);
                        Object value = originField.get(origin);
                        if (null != value) {
                            desField.set(destination, value);
                        }
                        desField.setAccessible(false);
                    } catch (Exception e) {
                        isSuccess = false;
                    }
                    continue;
                }
            }
        }
        return isSuccess;
    }


    /**
     * 反向
     * 赋值到destination
     *
     * @param origin      无注解
     * @param destination 有注解
     * @param <T>
     * @return
     */
    public static <T> boolean merge2AnnotionObject(T destination, T origin) {
        boolean isSuccess = true;
        if (destination == null || origin == null)
            return false;
        List<Field> originList = getDeclaredFields(origin);
        List<Field> desList = getDeclaredFields(destination);
        for (Field originField : originList) {
            for (Field desField : desList) {
                ColumnsName annotation = desField.getAnnotation(ColumnsName.class);
                if (desField.getName().equals(originField.getName())
                        || (annotation != null && originField.getName().equals(annotation.fieldName()))) {
                    try {
                        desField.setAccessible(true);
                        Object value = originField.get(origin);
                        if (null != value) {
                            desField.set(destination, value);
                        }
                        desField.setAccessible(false);
                    } catch (Exception e) {
                        isSuccess = false;
                    }
                    continue;
                }
            }
        }
        return isSuccess;
    }

    private static <T> List<Field> getDeclaredFields(T origin) {
        Class<?> clazz = origin.getClass();
        List<Field> list = new ArrayList<>();
        for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
            list.addAll(Arrays.asList(clazz.getDeclaredFields()));
        }
        return list;
    }

    /**
     * 两个不同类型的
     * origin 中的属性值拷贝到destination中
     *
     * @param destination
     * @param origin
     * @param <T>
     */
    public static <T> boolean mergeDiffObject(T destination, T origin) {
        boolean isSuccess = true;
        if (origin == null || destination == null)
            return false;
        Field[] fields = origin.getClass().getDeclaredFields();
        Field[] desFields = destination.getClass().getDeclaredFields();
        int length = fields.length;
        int desLength = desFields.length;
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < desLength; j++) {
                if (fields[i].getName().equals(desFields[j].getName())) {
                    try {
                        desFields[j].setAccessible(true);
                        Object value = fields[i].get(origin);
                        if (null != value) {
                            desFields[j].set(destination, value);
                        }
                        desFields[i].setAccessible(false);
                    } catch (Exception e) {
                        isSuccess = false;
                        LogUtils.i(TAG, "mergeDiffObject:{}", e.getMessage());
                    }
                    continue;
                }
            }
        }
        return isSuccess;
    }


    /**
     * 两个相同类型的obj
     *
     * @param origin
     * @param destination
     * @param <T>
     */
    public static <T> boolean mergeObject(T origin, T destination) {
        boolean isSuccess = true;
        if (origin == null || destination == null)
            return false;
        if (!origin.getClass().equals(destination.getClass()))
            return false;

        Field[] fields = origin.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            try {
                fields[i].setAccessible(true);
                Object value = fields[i].get(origin);
                if (null != value) {
                    fields[i].set(destination, value);
                }
                fields[i].setAccessible(false);
            } catch (Exception e) {
                isSuccess = false;
                LogUtils.i(TAG, "mergeDiffObject:{}", e.getMessage());
            }
        }
        return isSuccess;
    }

}

相关文章

  • 菜鸟学服务端技术----Spirng基础

    注解 Java基础加强总结(一)——注解(Annotation) java中的注解是如何工作的? java 注解 ...

  • 自定义注解

    java annotation基础 java注解分为标准注解和元注解。 标准注解是java为我们提供的预定义的注解...

  • Java注解的使用

    Java注解的使用 参考 廖雪峰java教程 使用注解 什么是注解(Annotation)?注解是放在Java源码...

  • Java原生注解和Spring注解的说明

    注解 java 原生注解 Spring 中的注解 一 Java原生注解 Java注解是在JDK1.5以后引入的新特...

  • Java 注解

    JAVA注解 Java 自带注解(系统注解) @Override 表示重写注解 @Deprecated 表示过时的...

  • 1.8 Java 注解annotation

    1.1 注解声明 Java注解Annotation,有声明注解和元注解 元注解:Java提供的元注解,所谓元注解就...

  • Java注解学习总结(脑图)

    注解的提取测试:定义注解: 测试注解提取: 参考:《Java编程思想》java注解

  • Java注解

    Java注解(Annotation)详解(一)——概述及JDK自带注解 Java注解(Annotation)详解(...

  • JAVA-注解 Annotation

    JAVA-注解 Annotation sschrodinger 2018/6/4 基本 注解 Java 注解用于为...

  • Java注解简介篇

    摘要 本文详细介绍java注解是什么,如何声明java注解,如何解析java注解。最后介绍JDK提供的几大基本注解...

网友评论

      本文标题:java注解

      本文链接:https://www.haomeiwen.com/subject/pqbdvhtx.html