java.lang.annotation.ElementType枚举与
java.lang.annotation.@Target注解配合使用,如果一个注解没有指定@Target注解,则此注解可以用于除了类型参数和类型使用以外的任何地方。
ElementType.TYPE
/** Class,interface (including annotation type), or enum declaration */
可用于类、接口、注解类型、枚举
ElementType.FIELD
/** Fielddeclaration (includes enum constants) */
可用于成员变量、枚举常量
ElementType.METHOD
/** Methoddeclaration */
用于方法,静态方法、非静态方法,不能用于构造方法
ElementType.PARAMETER
/** Formalparameter declaration */
用于参数(方法形参)
ElementType.CONSTRUCTOR
/** Constructordeclaration */
用于构造器ElementType.LOCAL_VARIABLE
/** Local variabledeclaration */
用于方法局部变量
ElementType.ANNOTATION_TYPE
/** Annotation typedeclaration */
用于注解类型
ElementType.PACKAGE
/** Packagedeclaration */
用于包类型,只能用在package-info.java文件中。
ElementType.TYPE_PARAMETER
/** Type parameterdeclaration */
用于类型参数,即泛型方法、泛型类、泛型接口
代码如下
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;
/**
* 泛型定义
*/
@Declaration @Target(value = {ElementType.TYPE_PARAMETER}) @Retention(RetentionPolicy.RUNTIME) public @interface TypeParameterAnno { String value() default ""; }
/**
* 泛型使用
*/
import java.lang.reflect.AnnotatedType; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Lambda<@TypeParameterAnno E> { public <@TypeParameterAnno(value = "xxxx") T> void getLambda(T t) { System.out.println(t); } } interface Depth<@TypeParameterAnno F> { }
ElementType.TYPE_USE
/** Use of a type*/
类型使用.可以用于标注任意类型除了 class
import java.lang.annotation.ElementType; import java.lang.annotation.Target; @Target(value = {ElementType.TYPE_USE}) public @interface AnnoType { }
// 用于类
@AnnoType class A { }
// 用于接口
@AnnoTypeinterface B {}// 用于继续和实现
class Image extends @AnnoType A implements B{ }
// 用于构造函数
new@AnnoType String("/usr/bin")
//用于强制转换和instanceof检查,注意这些注解中用于外部工具,
// 它们不会对类型转换或者instanceof的检查行为带来任何影响。
String path=(@AnnoType String)input;
if(input instanceof@AnnoType String)
//用于指定异常
public Person read() throws @AnnoType IOException.
//用于通配符绑定
List<@AnnoType ? extends Person>
List<? extends @ReadOnly Person>
@AnnoType String.class //非法,不能标注class
import java.lang.@AnnoType String //非法,不能标注import
这里主要说明一下TYPE_USE,
类型注解用来支持在Java的程序中做强类型检查,
配合第三方插件工具(如Checker Framework),
可以在编译期检测出runtime error(如UnsupportedOperationException、NullPointerException异常),
避免异常延续到运行期才发现,从而提高代码质量,这就是类型注解的主要作用。
总之Java 8 新增加了两个注解的元素类型ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER ,
通过它们,我们可以把注解应用到各种新场合中。