如何判断一个class是否为annotation?
如何判断一个Class是否为注解类?
一、用反射API直接判断(推荐)
Java的Class类原生提供了isAnnotation()方法,能直接判断当前Class对象是否属于注解类型,这是最简便可靠的方式:
Class<?> annotationCls = MyCustomAnnotation.class; boolean result = annotationCls.isAnnotation(); // 如果MyCustomAnnotation是注解类,result会返回true
二、通过Annotation接口判断
所有注解类编译后都会自动实现java.lang.annotation.Annotation接口,因此可以用isAssignableFrom()方法来验证:
Class<?> targetCls = SomeClass.class; boolean isAnnotationType = Annotation.class.isAssignableFrom(targetCls);
注意:不要尝试用targetCls.getSuperclass()判断,因为注解类的父类是Object,它是通过实现接口的方式关联到Annotation的。
三、辅助判断:检查是否带有元注解
几乎所有实用的注解类都会被元注解(比如@Retention、@Target、@Documented等)修饰,所以可以通过检查类上是否存在这些元注解来辅助判断,但这不能作为唯一标准——语法上允许没有元注解的注解类存在:
Class<?> cls = TestAnnotation.class; boolean hasMetaAnnotation = cls.isAnnotationPresent(Retention.class) || cls.isAnnotationPresent(Target.class);
额外区分:注解类 vs 注解实例
如果拿到的是一个注解实例(比如通过反射从方法/类上获取到的注解对象),可以直接用instanceof判断:
Annotation annoInstance = someMethod.getAnnotation(MyCustomAnnotation.class); boolean isAnnoInstance = annoInstance instanceof Annotation;
内容的提问来源于stack exchange,提问作者yqingyu
相关产品推荐
相关产品推荐

