这篇博客算是自定义注解和java泛型的基础,纯个人理解,欢迎指正。

自定义注解

1. 老生常谈的元注解:
    @Documented:将此注解包含在 javadoc 中 
    @Retention:什么级别保存该注解信息
    @Target:注解作用域
    @Inherited:允许子类继承父类中的注解 
    提供一个csnd的[元注解参考]()博客

2.注解的定义规则:
    ①数据类型:基本类型 + String, Class, annotation, enumeration 以及他们的数组
    ②可以提供默认值,关键字default
    ③提供默认值以后,在使用注解的时候,就可以不显示声明相关参数值了。 
        这也是很多框架能够很简易使用注解的原因。
    ④value()算是注解里比较特殊的方法。因为value是可以缺省的 

3.注解的用处: 
    注解主要是为了增强反射,使反射更容易取到某些值。并在合适的切入点进行切入。

4.注解栗子:
    @Documented
    @Target(ElementType.FIELD)
    @Retention(RUNTIME)
    public @interface ColumnEx {

        public static enum Effictive {
            INSERT,
            DELETE,
            UPDATE,
            QUERY;
        }

        Effictive[] type() default {Effictive.UPDATE};

        boolean[] required() default { true };

        boolean ignore() default false;

} 

5.注解切入的栗子:
    private static <T> Map<String, Boolean> conditionsToMap(Class<T> clazz, Effictive type) {
    Map<String, Boolean> map = new HashMap<String, Boolean>();
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
        String fieldName = field.getName();
        ColumnEx equiredAnno =  field.getAnnotation(ColumnEx.class);
        if (equiredAnno == null) {
            map.put(fieldName, false);
        } else {
            if (!equiredAnno.ignore()) {
                Effictive[] types = equiredAnno.type();
                for (int i = 0; i < types.length; i++) {
                    Effictive requiredType = types[i];
                    if (requiredType == type) {
                        boolean[] requiredArray = equiredAnno.required();
                        boolean required = requiredArray[i];
                        map.put(fieldName, required);
                        break;
                    }
                }
            }
        }
    }
    return map;
}
我这里是在没有框架下,将含有注解的field映射成数据库字段,算是重复造简易轮子吧。
注解主要就是看你业务的切入点,如果直接没有切入点,那他只是个摆设。只有明确了业务需求,只有在合适的时机,对注解进行拦截和处理,才算是完整的注解。

java泛型

看过基础代码的,对T、E、C、K、V这类泛型应该不陌生吧。其实,泛型可以是任何字母,只是为了很多泛型按照使用环境,一般约定俗成的使用T、E、C、K、V等。

泛型和Object的区别:
    最大的区别就是,泛型在运行时,是不需要类型转换的。

泛型可以声明在类、接口、方法上。

类上的泛型

java对泛型new一个对象_java对泛型new一个对象


可以看出,当实例化以后,类的类型就确定了。

方法上的泛型

java对泛型new一个对象_实例化_02


这时,实例化类就不需要声明泛型的类型了。泛型在调用方法时生效

在同一个类或方法中声明多个泛型

(这里仅以方法中定义多泛型作为示例)

java对泛型new一个对象_java对泛型new一个对象_03