可以用反射区获取注解,然后判断一下就ok了。
public boolean havaAnnotation(Annotation myannotation){
Person person = new Person(); //假设有个Person类
Class class= perongetClass();
Annotation[] annotations=classgetAnnotations();
for(i=0;i<annotationslength;i++){ //遍历循环
if(annotations[i]hashCode()==myannotationhashCode()) //用哈希码判断
return true;
}
return false;
}
我知道
1先获取这个类的class
Class<> objclass=tgetClass();
2 获取这个类的字段属性
Field[] at = objclassgetDeclaredFields();
3遍历所有字段
for (Field fd : at) {
//比如获取这个字段上是否包含NotNull
if (fdisAnnotationPresent(NotNullclass)) {
//这样就获取到这个注解属性了
NotNull d = fdgetAnnotation(NotNullclass);
}
}
4要获取一个注解,你要先获取他所在的字段
希望对你有帮助!
一、从注解中获取
使用注解方式,我们需要自定义一个注解,在注解中指定参数名,然后通过反射机制,获取方法参数上的注解,从而获取到相应的注解信息。这里自定义的注解是Param,通过value参数指定参数名,定义了一个工具类ParameterNameUtils来获取指定方法的参数名列表,这里获取测试类ParameterNameTest中定义的方法method1的参数名列表表,下面是具体的代码。
注解的使用一般是与java的反射一起使用,下面是一个例子
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
自定义注解及其应用
1)、定义一个最简单的注解
public @interface MyAnnotation {
//
}
2)、把注解加在某个类上:
@MyAnnotation
public class AnnotationTest{
//
}
以下为模拟案例
自定义注解@MyAnnotation
1 package comljqtest;
2
3 import javalangannotationElementType;
4 import javalangannotationRetention;
5 import javalangannotationRetentionPolicy;
6 import javalangannotationTarget;
7
8 /
9 定义一个注解
10
11
12 @author jiqinlin
13
14 /
15 //Java中提供了四种元注解,专门负责注解其他的注解,分别如下
16
17 //@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
18 //RetentionPolicySOURCE: 停留在java源文件,编译器被丢掉
19 //RetentionPolicyCLASS:停留在class文件中,但会被VM丢弃(默认)
20 //RetentionPolicyRUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
21
22 //@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
23 //ElementTypeCONSTRUCTOR: 构造器声明
24 //ElementTypeFIELD: 成员变量、对象、属性(包括enum实例)
25 //ElementTypeLOCAL_VARIABLE: 局部变量声明
26 //ElementTypeMETHOD: 方法声明
27 //ElementTypePACKAGE: 包声明
28 //ElementTypePARAMETER: 参数声明
29 //ElementTypeTYPE: 类、接口(包括注解类型)或enum声明
30
31 //@Documented将注解包含在JavaDoc中
32
33 //@Inheried允许子类继承父类中的注解
34
35
36 @Retention(RetentionPolicyRUNTIME)
37 @Target({ElementTypeMETHOD, ElementTypeTYPE})
38 public @interface MyAnnotation {
39 //为注解添加属性
40 String color();
41 String value() default "我是林计钦"; //为属性提供默认值
42 int[] array() default {1, 2, 3};
43 Gender gender() default GenderMAN; //添加一个枚举
44 MetaAnnotation metaAnnotation() default @MetaAnnotation(birthday="我的出身日期为1988-2-18");
45 //添加枚举属性
46
47 }
注解测试类AnnotationTest
1 package comljqtest;
2
3 /
4 注解测试类
5
6
7 @author jiqinlin
8
9 /
10 //调用注解并赋值
11 @MyAnnotation(metaAnnotation=@MetaAnnotation(birthday = "我的出身日期为1988-2-18"),color="red", array={23, 26})
12 public class AnnotationTest {
13
14 public static void main(String[] args) {
15 //检查类AnnotationTest是否含有@MyAnnotation注解
16 if(AnnotationTestclassisAnnotationPresent(MyAnnotationclass)){
17 //若存在就获取注解
18 MyAnnotation annotation=(MyAnnotation)AnnotationTestclassgetAnnotation(MyAnnotationclass);
19 Systemoutprintln(annotation);
20 //获取注解属性
21 Systemoutprintln(annotationcolor());
22 Systemoutprintln(annotationvalue());
23 //数组
24 int[] arrs=annotationarray();
25 for(int arr:arrs){
26 Systemoutprintln(arr);
27 }
28 //枚举
29 Gender gender=annotationgender();
30 Systemoutprintln("性别为:"+gender);
31 //获取注解属性
32 MetaAnnotation meta=annotationmetaAnnotation();
33 Systemoutprintln(metabirthday());
34 }
35 }
36 }
枚举类Gender,模拟注解中添加枚举属性
1 package comljqtest;
2 /
3 枚举,模拟注解中添加枚举属性
4
5 @author jiqinlin
6
7 /
8 public enum Gender {
9 MAN{
10 public String getName(){return "男";}
11 },
12 WOMEN{
13 public String getName(){return "女";}
14 }; //记得有“;”
15 public abstract String getName();
16 }
注解类MetaAnnotation,模拟注解中添加注解属性
1 package comljqtest;
2
3 /
4 定义一个注解,模拟注解中添加注解属性
5
6 @author jiqinlin
7
8 /
9 public @interface MetaAnnotation {
10 String birthday();
11 }
以上就是关于java判断类上是否有指定注解全部的内容,包括:java判断类上是否有指定注解、各位大神,求救!!!java 如何获取该类上字段的注解,看图片、Java如何获取方法参数中的名称等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)