这篇博客算是自定义注解和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的区别:
最大的区别就是,泛型在运行时,是不需要类型转换的。
泛型可以声明在类、接口、方法上。
类上的泛型
可以看出,当实例化以后,类的类型就确定了。
方法上的泛型
这时,实例化类就不需要声明泛型的类型了。泛型在调用方法时生效
在同一个类或方法中声明多个泛型
(这里仅以方法中定义多泛型作为示例)