JDK1.5引入了注解。
- 按来源分类:
自带注解
第三方注解
自定义注解
自带注解:例如Override,Deprecated,Suppvisewarnnings。
Override是来标识重写的,如果没有重写,就会报错。
Deprecated是用来标识过时的方法,如果使用的话会有风险提示,并划横线,使用Suppvisewarnnings就可确认使用,消除风险提示。
第三方注解:例如Spring当中的Autowired,Service,Resource,Repository.Mybatis当中的InsertProvider,Updateprovider,Options等等。
自定义注解:public @interface [注解名].
- 按运行机制分类:
源码注解
编译时注解
运行时注解
源码注解:在源码的时候存在,编译成class文件则消失
编译时注解:源码存在,编译成class文件也存在
运行时注解:要对程序运行有作用,例如Autowired注解就可以自动装配实例。
- 自定义注解实例:
/**
@author:micro_hz
2015年8月21日
*/
//Target目标,定义注解起作用的范围,这里定义了Method和类上的作用
@Target({ElementType.METHOD,ElementType.TYPE})
//注解可以继承
@Inherited
//注解注解的运行机制
@Retention(RetentionPolicy.RUNTIME)
//注解生成文档时候保留注解
@Documented
public @interface Description {
//如果只有一个注解,必须是value,这个时候使用注解的的时候不用写参数value名和"=",直接写内容Description("")
String value();
}
- 我们在普通的类中使用该自定义注解
package annotation.test;
/**
@author:micro_hz
2015年8月21日
*/
//在类上使用了我们自定义的注解
@Description("this is a class Annotation")
public class AnnotationTest {
//在方法上使用我们自定义的注解
@Description("this is a method Annotation")
@Deprecated//使用该注解表示该方法已经过时
public void deprecatedMethod()
{
System.out.println("i am a Deprecated Annotation method");
}
public void p()
{
System.out.println("this is a AnnotationTest class");
}
}
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
/**
@author:micro_hz
2015年8月21日
*/
public class Test {
@SuppressWarnings("deprecation")
public static void main(String args[])
{
//若使用Deprecated注解的方法,会警告,添加SuppressWarnnings即可确认使用,消除风险
AnnotationTest annotationTest = new AnnotationTest();
annotationTest.deprecatedMethod();
try {
//获得类上的注解内容
//使用类加载得到这个类
Class<?> c = Class.forName("annotation.test.AnnotationTest");
//判断这个类是否存在Description这个注解
if(c.isAnnotationPresent(Description.class))
{
//若存在即打印出来这个类的value注解值
Description d = (Description) c.getAnnotation(Description.class);
System.out.println(d.value());
}
//获得方法上的注解内容
/*
* 方法1
*/
//获得所有的方法
Method[] methods = c.getMethods();
//遍历所有的方法
for(Method m : methods)
{
//获得每个方法的所有注解
Annotation[] as = m.getAnnotations();
//遍历每个注解
for(Annotation a : as)
{
//如果注解为Description类型,打印出value
if(a instanceof Description)
{
System.out.println(((Description) a).value());
}
}
}
/*
* 方法2
*/
for(Method m : methods)
{
//判断方法是否有该注解,有就打印出该注解的value
if(m.isAnnotationPresent(Description.class))
{
System.out.println(((Description)m.getAnnotation(Description.class)).value());
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
i am a Deprecated Annotation method
this is a class Annotation
this is a method Annotation
this is a method Annotation
- 工程目录
慕课网注解教程
元注解作用域:
继承是继承类上的注解,不继承方法上的注解。