现在人类越来越懒了,以前程序员是代码的搬运工,现在搬运工也不想当,总想着,造一些工具来自动搬运,减少频繁的复制和粘贴,让代码自动处理,从而出现优雅和灵活的编程方式。

注解的主要作用:
- 用来生成描述文件
- 减轻编写“样板”代码负担
三种标准注解:
@Overried
:当前方法的定义将覆盖父类方法
@Deprecated
:发出编译器警告
@SuppressWarnings
:关闭不当的编译器警告
四种元注解:
@Target()
:表示该注解可以用在什么地方。CONSTRUCTOR
:构造器声明、FIELD
:域声明、LOCAL_VARIABLE
:局部变量声明、METHOD
:方法声明、PACKAGE:包声明、PARAMETER参数声明、TYPE:类、接口、注解或者enum声明。在使用的过程中,可以用逗号隔开指定多个值,也可省去该注解,指定所有值,但在实际开发总,很少这样子。
@Retention()
:表示需要在什么级别保存该注解信息。SOURCE
:注解将在编译器被丢弃、CLASS
:注解在class文件可用,在JVM被丢弃、RUNMTIME
:VM将在运行期保存该注解,因此可以通过反射机制读取注解信息。
@Document
:将此注解包含在Javadoc中。
@Inherited
:允许子类继承父类的注解。
定义注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cat {
public int id();
public String description() default "no description";
}
注解的元素在使用时表现为名-值的形式,并需要至于@Cat括号内:
public class CatOne {
@Cat(id=100)
public String catId(){
return "2k3k35l";
}
@Cat(id=100,description="miao~")
public String catName() {
return "miao";
}
}
编写注解处理器工具,如果没有注解处理工具,那么注解也不会比注释更有用:
public class DealAnnotation {
public static void main(String[] args) {
findDemo(CatOne.class);
}
private static void findDemo(Class<?> cl) {
for (Method m : cl.getDeclaredMethods()) {
Cat annotation = m.getAnnotation(Cat.class);
if (annotation != null) {
System.out.println("id:" + annotation.id() + " description:"
+ annotation.description());
}
}
}
}
运行结果:
id:100 description:no description
id:100 description:miao~
- 如果在应用注解的时候,注解只有一个元素,且元素名为 value,可以省略key。
@Dog("dog") private String name;
- 一个目标可以使用多个注解,但注解不能重复。
注解处理工具apt和单元测试感兴趣的可以了解一下。
java se7:
@SafeVarargs
参数安全类型,提醒开发者不要用参数做一些不安全的操作
java se8 新增了:
@FunctionalInterface
函数式接口注解,毕竟函数编程现在很火。
@Repeatable
可重复的
本文是基于JAVA编程思想第四版的理解总结,基于java se5.如有偏差,欢迎指正。
网友评论