java自定义注解和使用[通俗易懂]

自定义注解@Target自定义注解的使用范围ElementType.METHOD:方法声明ElementType.TYPE:类、接口(包括注解类型)或enum声明ElementType.CONSTRUCTOR:构造器的声明ElementType.FIELD:域声明(包括enum实例)ElementType.LOCAL_VARIABLE:局部变量声明ElementType.PACKA…

大家好,又见面了,我是你们的朋友全栈君。

自定义注解

@Target
自定义注解的使用范围
ElementType.METHOD:方法声明
ElementType.TYPE:类、接口(包括注解类型)或enum声明
ElementType.CONSTRUCTOR:构造器的声明
ElementType.FIELD:域声明(包括enum实例)
ElementType.LOCAL_VARIABLE:局部变量声明
ElementType.PACKAGE:包声明
ElementType.PARAMETER:参数声明
@Retention
注解级别信息
RetentionPolicy.RUNTIME:VM运行期间保留注解,可以通过反射机制读取注解信息
RetentionPolicy.SOURCE:注解将被编译器丢弃
RetentionPolicy.CLASS:注解在class文件中可用,但会被VM丢弃
@Document
将注解包含在Javadoc中
@Inherited
允许子类继承父类中的注解,默认不能被子类继承
创建一个自定义注解
/** * 自定义注解 * @author Le */
@Target({ 
   ElementType.METHOD, ElementType.TYPE})
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation { 
   
	String msg() default "this is myAnnotation"; //default 默认值
}
定义一个接口
package mydemo;

@MyAnnotation //使用自定义注解
public interface Message { 
   
	
	@MyAnnotation
	public void msg();
}

接口实现
package mydemo;

@MyAnnotation
public class MessageImpl implements Message { 
   

	@Override
	@MyAnnotation(msg = "我是自定义注解信息...")
	public void msg() { 
   
		// TODO Auto-generated method stub
	}
}

测试

package mydemo;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class Mytest { 
   

	Annotation[] annotation = null;
	
	public static void main(String[] args) throws ClassNotFoundException { 
   
		new Mytest().getAnnotation();
	}

	private void getAnnotation() throws ClassNotFoundException { 
   
		Class<?> clazz = Class.forName("mydemo.MessageImpl"); //
		boolean isEmpty = clazz.isAnnotationPresent(mydemo.MyAnnotation.class); //判断clazz是否使用了MyAnnotation自定义注解
		if (isEmpty) { 
   
			annotation = clazz.getAnnotations(); //获取注解接口
			for (Annotation a : annotation) { 
   
				MyAnnotation my = (MyAnnotation) a; //强制转换成MyAnnotation类型
				System.out.println(clazz + "--" + my.msg());
			}
		}
		
		Method[] method = clazz.getMethods();
		System.out.println("Method");
		for (Method m : method) { 
   
			boolean ismEmpty = clazz.isAnnotationPresent(mydemo.MyAnnotation.class);
			if (ismEmpty) { 
   
				Annotation[] aa = m.getAnnotations();
				for (Annotation a : aa) { 
   
					MyAnnotation my = (MyAnnotation) a;
					System.out.println(m + "--" + my.msg());
				}
			}
		}	
	}
}
运行输出内容如下:
class mydemo.MessageImpl--this is myAnnotation
Method
public void mydemo.MessageImpl.msg()--我是自定义注解信息...

参考:Java 自定义注解及利用反射读取注解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129174.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 简述android触屏事件的处理_移动端touch事件有哪些

    简述android触屏事件的处理_移动端touch事件有哪些本文介绍了Android系统中触屏事件的相关知识,包括触屏事件的产生,分类,触屏事件序列,以及触屏事件在代码中的表示方式。了解这些内容,是理解Android触屏事件的分发,拦截和处理的基础。

  • 徜徉在宋词里的女子

    徜徉在宋词里的女子

  • app产品设计流程_APP流程图

    app产品设计流程_APP流程图App设计流程第一步、从APP产品需求入手,考虑我们到底要用什么主色调根据产品定位和目标用户群体选择主色调定好尺寸:设计尺寸是多大,是以640*1136设计还是750*1136还是1242*2208来设计。所有APP设计尺寸大小规范:http://www.25xt.com/appsize   第二步、配色和辅助色用什么颜色在考虑到产品气质和品牌色的同时,我们经常要考虑配合衬托产品主色调的辅助色…

  • mysql语句和sql语句的区别_mongodb和mysql的区别

    mysql语句和sql语句的区别_mongodb和mysql的区别MySQL和SQL之间的区别有哪些?很多PHP的初学者,对MySQL,MyAdmin和SQL有什么区别并不是很清楚?下面php中文网就带领大家来学习一下MySQL和SQL之间的区别。【推荐阅读:MySQL什么意思】一:什么是SQLSQL是一种数据库语言,可以定义和操作数据库。SQL由ISO(国际标准化组织)标准化,和其他数据库中几乎是相同的方式运行,SQL大致分为三种语言。它在控制和操作数据库时使…

  • cad2016新手入门教程_cad制图初学入门教程

    cad2016新手入门教程_cad制图初学入门教程关注公众号,免费获取资料​​适用人群没有基础却想要学习CAD的学员课程概述课程目标:快速学习CAD绘图设计课程特色:完全脱离理论与书,纯实例教学章节1:开篇课时1重要的开篇01:02章节2:AutoCAD软件介绍课时2软件介绍06:12章节3:AutoCAD界面布局课时3界面布局介绍06:22章节4:AutoCAD操作步骤课时…

  • 细谈Type-C、PD原理(一)[通俗易懂]

    细谈Type-C、PD原理(一)[通俗易懂]第一部分包含:一、二、三、四第二部分包含:五、六目录一、Type-C简介以及历史二、Type-CPort的DataRole、PowerRole三、Type-C的Data/PowerRole识别协商/AltMode四、如何进行数据链路的切换五、相关参数/名词/状态解释六、PD协议简介一、Type-C简介以及历史自1998年…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号