猿来绘Java-45-JDK8新特性可重复注解和类型注解

Java 8对注解处理提供了两点改进: 可重复的注解及可用于类型的注解。此外,反射也得到了加强,在Java8中能够得到方法参数的名称。这会简化标注在方法参数上的注解

可重复注解:

① 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class

② MyAnnotation的Target和Retention等元注解与MyAnnotations相同。(相同的Target,Retention,Inherited)

JDK8之前可重复注解的写法

package com.ylaihui.annotation2;

public @interface MyAnn {
    String value() default "ylaihui";
}
package com.ylaihui.annotation2;

public @interface MyAnnotations {
    MyAnn[] value();
}
//MyAnnotationsTest.java
package com.ylaihui.annotation2;

// 注解不能重复
//Duplicate annotation. The declaration of 
//'com.ylaihui.annotation2.MyAnn' does not have a valid
//@MyAnn("yyyy")
//@MyAnn("lll")
@MyAnnotations({@MyAnn("yyyy"), @MyAnn("llll")})
public class MyAnnotationsTest {
}

JDK8可重复注解的写法

package com.ylaihui.annotation3;

import java.lang.annotation.Repeatable;

@Repeatable(MyAnnotations.class)
public @interface MyAnn {
    String value() default "ylaihui";
}
package com.ylaihui.annotation3;

import java.lang.annotation.Repeatable;

public @interface MyAnnotations {
    MyAnn[] value();
}
//MyAnnotationsTest.java
package com.ylaihui.annotation3;

// JDK1.8 新特性,注解可重复,但是需要配置,以下两种写法等价
@MyAnn("yyyy")
@MyAnn("lll")
//@MyAnnotations({@MyAnn("yyyy"), @MyAnn("llll")})
public class MyAnnotationsTest {
}

JDK8新特性类型注解

JDK1.8之后,关于元注解@Target的参数类型ElementType枚举值多了两个:TYPE_PARAMETER,TYPE_USE。

在Java 8之前, 注解只能是在声明的地方所使用, Java8开始, 注解可以应用在任何地方。

ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如: 泛型声明) 修饰的类型可以通过反射获取

ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。

package com.ylaihui.annotation4;

import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;

@Target({TYPE_PARAMETER, TYPE_USE})
public @interface MyAnn {
    String[] value() default "ylaihui";
}
//AnnotationTest.java
package com.ylaihui.annotation4;

import java.util.ArrayList;

class Annotations<@MyAnn T>{

    public void info(@MyAnn String string) throws @MyAnn RuntimeException{

        ArrayList<@MyAnn String> list = new ArrayList<>();
        int d = (@MyAnn int)100.00;
        System.out.println(string);
    }
}

public class AnnotationTest {
    public static void main(String[] args) {
    }
}

猜你喜欢

转载自blog.csdn.net/asdfjklingok/article/details/118101017
今日推荐