注解
2017-12-05 本文已影响0人
鉴闻俗说
一、 Annotation的工作方式
Annotation并不会直接影响程序的语义,它的工作方式类似于程序的类库或者工具,它反过来会对程序的语义有所影响。Annotation可以从源文件、class文件或者以运行时反射的多种方式被读取。
二、 几个常用的注解
1、Override注解表示子类要重写父类对应的方法。
2、Deprecated注解表示方法不建议被使用;
3、SurpressWarnings注解表示一直警告。
4 、Retentoion注解用于在定义主解时修饰注解该如何读取。在使用时必须搭配属性value,value的取值是一个RetentionPolicy枚举类型:
@Retention(RetentionPolicy.RUNTIME) //表示在运行时反射获取Annotation
//@Retention(RetentionPolicy.CLASS) //表示从class文件获取Annotation
//@Retention(RetentionPolicy.SOURCE) //表示从源文件获取Annotation
5 、Target注解用于在定义主解时限定注解的使用位置。在使用时也必须搭配属性value,value的去值是一个ElementType枚举类型:
//不同的枚举类型表示该注解只能作用的位置
@Target(value = ElementType.METHOD)
//@Target(value = ElementType.ANNOTATION_TYPE)
//@Target(value = ElementType.CONSTRUCTOR)
//@Target(value = ElementType.FIELD)
//@Target(value = ElementType.LOCAL_VARIABLE)
//@Target(value = ElementType.PACKAGE)
//@Target(value = ElementType.PARAMETER)
//@Target(value = ElementType.TYPE)
//@Target(value = ElementType.TYPE_PARAMETER)
//@Target(value = ElementType.TYPE_USE)
三、 自定义注解
1、自定义注解时,当注解的属性名时value时,对其赋值时可以不指定属性名称直接写上属性值即可;除了value之外其他的属性都必须以name = value的方式赋值。
2、Demo
(1) 自定义的注解
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) //表示在运行时反射获取Annotation
//@Retention(RetentionPolicy.CLASS) //表示从class文件获取Annotation
//@Retention(RetentionPolicy.SOURCE) //表示从源文件获取Annotation
public @interface MyAnnotation
{
String hello() default "hello";
String world();
}
(2)注解的使用
public class MyTest
{
@MyAnnotation(hello = "tiangjin", world = "shanghai")
@Deprecated
@SuppressWarnings("unchecked")
public void output()
{
System.out.println("output something!");
}
}
(2)利用反射查看注解
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class MyReflectTest
{
public static void main(String[] args) throws Exception
{
MyTest myTest = new MyTest();
Class<?> c =myTest.getClass();
Method method = c.getMethod("output", new Class[] {});
if (method.isAnnotationPresent(MyAnnotation.class))
{
method.invoke(myTest, new Object[] {});
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String hello = myAnnotation.hello();
String world = myAnnotation.world();
System.out.println(hello + " " + world);
}
Annotation[] annotations = method.getAnnotations();
for(Annotation annotation : annotations)
System.out.println(annotation.annotationType().getName());
}
}
四、 注解的继承关系
默认情况下,子类是不会继承父类中的Annotation的,如果想要继承父类中的某些Annotation,需要在在定义该Annotation形态时加上java.lang.Annoatation.Inherited形态的Annotation。