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 自定义注解及利用反射读取注解

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 移动端app开发流程分析「建议收藏」

    移动端app开发流程分析「建议收藏」随着信息技术的不断发展,互联网早已经向移动互联网过渡,而智能手机正在逐步取代桌面电脑的地位,手机APP成为人们获取各类信息、服务的强大渠道。在移动互联网时代,每个企业都希望能够分享流量红利,从而让自己的企业发展的更好。选择一款适合自己的手机APP成为每个企业都在思考的问题。对于大部分的企业,尤其是餐饮、旅游、教育、美容美发、医美、健身、建筑、房地产等传统行业来讲,因为这部分企业主并不是从事互联…

    2022年6月16日
  • 色彩缤纷的Python(改变字体颜色及样式)

    色彩缤纷的Python(改变字体颜色及样式)色彩缤纷的python(改变字体颜色及样式)在项目过程中,我们常常会因为输出信息的颜色与样式过于单调以至于让人在视觉上感到很杂乱,所以看下文:python在Linux终端中,使用转义序列来进行如

    2022年7月5日
  • 浅谈CAS原理_cas算法原理

    浅谈CAS原理_cas算法原理1.背景我们知道,synchronized就是一种独占锁,独占锁是一个悲观锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一种更加有效的锁就是乐观锁,CAS就是一种乐观锁2.CAS原理CAS(CompareAndSwap),比较并交换。我们知道,如果我要对一个变量进行操作,可以分为三个步骤读取该变量的值进行一系列的运算得到新的结果将运算的结果保存这儿需要知道CAS中有三个概念:内存地址的值V,旧值(从内存地址读取到的值)A,新值(进行操作后的结果值)。对应上面三

    2022年10月9日
  • vga转HDMI与hdmi转VGA区别

    vga转HDMI与hdmi转VGA区别

    2022年2月7日
  • Singular Value Thresholding (SVT) 奇异值阈值

    Singular Value Thresholding (SVT) 奇异值阈值这个算法受到压缩感知中迭代算法的启发,在迭代过程中对矩阵进行SVD,然后将较小的奇异值设置为0,生成新的矩阵进行迭代。该算法运算速度快,对于高位低秩矩阵的恢复非常有效。

    2022年6月2日
  • 为什么hashmap线程不安全我们还要用_arraylist线程不安全体现在哪里

    为什么hashmap线程不安全我们还要用_arraylist线程不安全体现在哪里一、Map概述我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。Map类继承图上面展示了java中Map的继承图,Map是一个接口,我们常用的实现类有HashMap、LinkedHashMap、TreeMap,HashTable。HashMap根据key的hashCode值来保存value,需要注意的是,HashMap不保证遍历的顺序和插入的顺序是一致的。HashMap允许有一条记录的key为null,但

    2022年10月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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