JAVA自定义注解、元注解介绍及自定义注解使用场景

自定义注解会需要元注解,此处先介绍元注解。

元注解
java中有四种元注解:@Retention、@Inherited、@Documented、@Target

@Retention
注解的保留位置(枚举RetentionPolicy),RetentionPolicy可选值:

  • SOURCE:注解仅存在于源码中,在class字节码文件中不包含
  • CLASS:默认的保留策略,注解在class字节码文件中存在,但运行时无法获得
  • RUNTIME:注解在class字节码文件中存在,在运行时可以通过反射获取到

@Inherited
声明子类可以继承此注解,如果一个类A使用此注解,则类A的子类也继承此注解

@Documented
声明注解能够被javadoc等识别(下面自定义注解处会有例子做介绍,点击查看)

@Target
用来声明注解范围(枚举ElementType),ElementType可选值:

  • TYPE:接口、类、枚举、注解
  • FIELD:字段、枚举的常量
  • METHOD:方法
  • PARAMETER:方法参数
  • CONSTRUCTOR:构造函数
  • LOCAL_VARIABLE:局部变量
  • ANNOTATION_TYPE:注解
  • PACKAGE:包

自定义注解介绍
自定义注解使用场景

  1. 类属性自动赋值。
  2. 验证对象属性完整性。
  3. 代替配置文件功能,像spring基于注解的配置。
  4. 可以生成文档,像java代码注释中的@see,@param等

1和2这个没有做过类似实例,应该是像Hibernate中的使用注解映射Bean对象到数据库一样(此处为个人猜测,如有错误请留言指出),中间有检测和自动赋值。

自定义注解定义

定义一个自定义注解(不使用元注解):

public @interface Action{}

定义一个自定义注解(使用元注解,每个元注解都是可选,非必选):

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
public @interface Action{
    	/**
	 * 操作类型
	 * @return
	 */
	//public String operateType() default "";
	/**
	 * 方法描述
	 * @return
	 */
	public String description() default "no description";
	
	
	/**
	 * 归属模块
	 * @return
	 */
	public SysAuditModelType ownermodel() default SysAuditModelType.NULL ; 
	/**
	 * 日志类型
	 * @return
	 */
	public String exectype() default "操作日志";
	
	/**
	 * 详细信息
	 * @return
	 */
	public String detail() default "";
	
	/**
	 * 执行顺序
	 */
	public ActionExecOrder execOrder() default ActionExecOrder.AFTER;
}

注解中可以声明成员方法,声明的成员方法为最终的注解里面的参数,成员方法可以使用default关键字设置默认值。上面的注解使用如:

@Action(description="图表导出word",execOrder=ActionExecOrder.AFTER,detail="图表导出word<#if fl>成功<#else>失败</#if>(W_QBD_FAL_PROBLEMRESET)")

 

自定义注解演示
新建一个自定义注解:

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target({ElementType.FIELD,ElementType.METHOD})
@interface MyAnno{
    public String name() default "zhangsan";
    public String email() default "hello@example.com";
}



定义一个User类,来使用自定义注解:

class  User{

    @MyAnno(name = "zhang")
    private String name;

    @MyAnno(name = "zhang@example.com")
    private String email;


    @MyAnno(name = "sayHelloWorld")
    public String sayHello(){
        return "";
    }
}
  • 通过反射获取注解信息 

下面我们通过反射来演示下获取属性的注解信息和方法的注解信息:
 

Method[] methods = User.class.getMethods();
//Field[] fields = User.class.getFields();
Field[] fields = User.class.getDeclaredFields();
/*
    getFields:只能访问public属性及继承到的public属性
    getDeclaredFields:只能访问到本类的属性,不能访问继承到的属性

    getMethods:只能访问public方法及继承到的public方法
    getDeclaredMethods:只能访问到本类的方法,不能访问继承到的方法

    getConstructors:只能访问public构造函数及继承到的public构造函数
    getDeclaredConstructors:只能访问到本类的构造函数,不能访问继承到的构造函数
*/

for (Field field : fields) {
    MyAnno annotation = field.getAnnotation(MyAnno.class);
    if(annotation!=null){
        System.out.println("property="+annotation.name());
    }
}
for (Method method : methods) {
    MyAnno annotation = method.getAnnotation(MyAnno.class);
    if(annotation!=null){
        System.out.println("sayHello="+annotation.name());
    }
}

输出如下:

property=zhang 
property=zhang@example.com 
sayHello=sayHelloWorld


原文:https://blog.csdn.net/bluuusea/article/details/79996572 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java自定义注解使用场景有很多,以下是其中几个常见的场景: 1. 代码级别的标记:自定义注解可以用来将特定的标记注解到代码中,以便在后续的处理中能够根据这些标记进行相应的逻辑处理。比如,可以自定义一个注解来标记某个方法需要进行性能监控,然后在运行时通过反射获取到被标记的方法,从而进行性能监控的统计。 2. 配置文件读取:自定义注解可以用来读取配置文件中的参数值,从而简化配置文件的读取和解析过程。比如,可以自定义一个注解来读取配置文件中的数据库连接信息,然后通过反射获取到被标记的字段,并将配置文件中的参数值设置到对应的字段上。 3. 代替XML配置文件:自定义注解可以用来代替繁琐的XML配置文件,从而简化配置的过程。比如,可以自定义一个注解来标记某个类需要在启动时进行初始化,然后在启动时扫描所有被标记的类,并进行相应的初始化操作。 4. AOP编程:自定义注解可以用来实现面向切面编程(AOP),将横切逻辑从业务逻辑中解耦出来。比如,可以自定义一个注解来标记某个方法需要进行事务处理,然后在运行时根据该注解进行事务的开启、提交或回滚。 总的来说,自定义注解使用场景较为广泛,可以根据具体的需求来合理地运用。它能够提高代码的可读性和维护性,同时也能够简化一些繁琐的操作,提高开发效率。但需要注意的是,自定义注解只是一种数据的定义,需要通过反射等手段来读取和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值