注解

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。

上一篇: 动态代理模式
下一篇:JUnit单元测试

上一篇下一篇

猜你喜欢

热点阅读