java注解的重要性/学习目的:
1.能看别人的代码,特别是框架代码,因为肯定与注解有关。
2.让代码简洁明了,代码清晰易懂。
java注解是java1.5引入的:注解概念是java提供的一种原程序中的元素关联任何信息和元数据的途径和方法。
A:常见注解(编译时注解);
@override:方法覆盖了它的父类的方法
@Deprecated:这个注释是一个标记注释。所谓标记注释,就是在源程序中加入这个标记后,并不影响程序的编译,但有时编译器会显示一些警告信息。或者在方法名上加一横线,意思是建议不使用
@SuppressWarnings(“”):对代码中变量或方法的警告提示,也是想告诉该方法存在潜在风险等。
B:注解分类
1.按照运行机制分类
源码注解:只在java源码中存在,编译成.class文件时就不存在了。
编译时注解:在源码和.class文件中存在。
运行时注解:在运行时起作用,甚至可以影响运行逻辑。
2.按照来源进行分类
a:JDK注解:
b:第三方注解:例如springMvc中的@Autowired,@Service,@Controller,Mybatis中的@InsertProvider,@UpdateProvider,@Options。
c:元注解:对注解的注解。例子如下四种元注解.
@Target({ ElementType.METHOD, ElementType.TYPE }) /@Targe指注解的作用域,包括METHOD方法声明,TYPE类接口,PARAMETER参数声明,PACKAGE包声明,LOCAL_VARIABLE局部变量声明,FIELD字段声明及CONSTRUCTOR构造方法声明/
@Retention(RetentionPolicy.RUNTIME) /@Retenion指生命周期:1,源码注解:注解只在源码中存在 ,编译成.class文件就不存在了。2,d:编译时注解:在源码和.class中都存在3,运行时注解:在运行阶段才会起作用的注解,甚至会影响运行逻辑的注解。/
@Inherited /@Inherited指允许子类继承/
@Documented/@Documented生成java doc时包含注解信息/
e:自己定义的注解:通常格式为@inferance+注解名 。如下举例说明:
定义了一个Discription注解
public @interface Description {
/*注解中的成员类型是受限制的:合法的类(int double等)包括原始类型及String,Class,Annotation,Enumeration等
* 如果注解只有一个成员,则成员名必须取名为value(),在使用注解时可以忽略成员名和赋值符号(=)
* 注解类可以没有成员,没有成员的注解称为标识注解****/
String desc();//注解中的成员(成员变量)以无参无异常方式声明
String author();
int age() default 18;//可以用default为成员指定一个默认值
}
先说说注解是如何使用的
@Description(author = “child”, desc = “在Child上的类注解”) //使用注解:使用注解语法 :@<注解名>(成员名1=值1,成员名2=值2…..)多个成员用逗号分隔,根据@Target指定的使用范围(注解的作用域,包括METHOD方法声明,TYPE类接口,PARAMETER参数声明,PACKAGE包声明,LOCAL_VARIABLE局部变量声明,FIELD字段声明及CONSTRUCTOR构造方法声明)来使用。
下面是对注解进行操作的一个小例子
public class Child{
@Description(author = "ldm", desc = "在Child的name()方法注解")
public String name() {
// TODO Auto-generated method stub
return null;
}
@Description(author = "child", desc = "Child中number()方法注解")
public String number() {
return "100";
}
}
public static void main(String[] args) {
// 首先使用类加载器加载类
try {
Class c = Class.forName("com.ldm.test.Child");
// 找到类上面的注解
boolean isExist = c.isAnnotationPresent(Description.class);// 判断注解是否存在
if (isExist) {
// 拿到注解实例
Description d = (Description) c.getAnnotation(Description.class);
System.out.println(d.desc());
}
//找到方法上的注解
Method[] ms=c.getMethods();
for (Method m : ms) {
boolean isMExist = m.isAnnotationPresent(Description.class);// 判断注解是否存在
if(isMExist){
// 拿到注解实例
Description d = (Description) m.getAnnotation(Description.class);
System.out.println(d.desc());
}
}
/**********************************************/
//另外一种解析方法
for (Method m : ms) {
Annotation []as=m.getAnnotations();
for (Annotation a : as) {
if(a instanceof Description){
Description d=(Description) a;
System.out.println(d.desc());
}
}
}
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
控制台打印语句:
在Child上的类注解
在Child的name()方法注解
Child中number()方法注解
在Child的name()方法注解
Child中number()方法注解