Java注解之java.lang.annotation.ElementType与java.lang.annotation.@Target

本文详细介绍了 Java 8 中新增的 ElementType 枚举和 @Target 注解的使用方式,特别是 ElementType.TYPE_USE 和 ElementType.TYPE_PARAMETER 的应用场景,以及如何利用它们进行强类型检查来提高代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 ,

通过它们,我们可以把注解应用到各种新场合中。

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值