`
yanfaguanli
  • 浏览: 658198 次
文章分类
社区版块
存档分类
最新评论

JAVA自定义注解(1)

 
阅读更多

1、自定义注解@People

  1. packagecom.kute.test.selfannotation;
  2. importjava.awt.Color;
  3. importjava.lang.annotation.Documented;
  4. importjava.lang.annotation.ElementType;
  5. importjava.lang.annotation.Retention;
  6. importjava.lang.annotation.RetentionPolicy;
  7. importjava.lang.annotation.Target;
  8. /**
  9. *使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。
  10. *在定义注解时,不能继承其他的注解或接口。
  11. *@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。
  12. *方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。
  13. *可以通过default来声明参数的默认值,如果不指定default,则该参数为必设项
  14. *
  15. *Annotation类型里面的参数该怎么设定:
  16. *第一,只能用public或默认(default)这两个访问权修饰.例如,Stringvalue();这里把方法设为defaul默认类型;
  17. *第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型
  18. *和String,Enum,Class,annotations等数据类型以及这一些类型的数组.
  19. *第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.
  20. *
  21. *注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。
  22. *因此,使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,
  23. *因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值["",-1]等,
  24. *例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。
  25. *
  26. *定义了注解,并在需要的时候给相关类,类属性加上注解信息,如果没有响应的注解信息处理流程,
  27. *注解可以说是没有实用价值。如何让注解真真的发挥作用,主要就在于注解处理方法
  28. *
  29. *@Target注解参数
  30. *1.CONSTRUCTOR:构造函数
  31. *2.FIELD:字段,枚举常量
  32. *3.LOCAL_VARIABLE:局部变量
  33. *4.METHOD:方法
  34. *5.PACKAGE:包
  35. *6.PARAMETER:方法参数
  36. *7.TYPE:接口,类,枚举,注解
  37. *
  38. *下面就开始定义一个@People的注解
  39. */
  40. @Documented
  41. @Retention(RetentionPolicy.RUNTIME)
  42. @Target({ElementType.TYPE,ElementType.METHOD})
  43. public@interfacePeople{
  44. //定义一个枚举,(男人,女人,好人,坏人,大人,小人)
  45. publicenumPeopleType{MAN,WOMAN,GOODMAN,BADMAN,BIGMAN,SMALLMAN}
  46. //定义了一个注解参数:人的类型,默认为男人
  47. publicPeopleTypetype()defaultPeopleType.MAN;
  48. publicStringname()default"";
  49. //此参数没有指定default,所以用@People注解的时候必须指定该参数
  50. publicintage();
  51. publicString[]fruitColor()default{"red","black"};
  52. }

2、解析注解
  1. packagecom.kute.test.selfannotation;
  2. importjava.lang.reflect.Method;
  3. importorg.slf4j.Logger;
  4. importorg.slf4j.LoggerFactory;
  5. importorg.springframework.beans.BeansException;
  6. importorg.springframework.beans.factory.InitializingBean;
  7. importorg.springframework.beans.factory.config.BeanPostProcessor;
  8. importorg.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
  9. importorg.springframework.util.ReflectionUtils;
  10. importcom.kute.test.selfannotation.People.PeopleType;
  11. publicclassAnnotionParse{
  12. privatestaticLoggerlogger=LoggerFactory.getLogger(AnnotionParse.class);
  13. publicvoidparse(Classclazz){
  14. try{
  15. Objectclasz=clazz.getConstructor(newClass[]{}).newInstance(
  16. newObject[]{});
  17. //clasz类上是否标注有People这个注解
  18. if(null!=clasz.getClass().getAnnotation(People.class)){
  19. Method[]methods=clasz.getClass().getDeclaredMethods();
  20. for(Methodmethod:methods){
  21. //annotation是方法上的注解
  22. Peoplepeople=method.getAnnotation(People.class);
  23. if(null!=people){
  24. //得到注解上的type参数的值
  25. ObjectoType=people.type();
  26. ObjectoName=people.name();
  27. intoAge=people.age();
  28. String[]fruitColor=people.fruitColor();
  29. StringBufferbuffer=newStringBuffer();
  30. for(Strings:fruitColor)
  31. buffer.append(s+",");
  32. logger.info("取出了方法的参数:[oType:"+oType+"],[oName:"
  33. +oName+"],[oAge:"+oAge+"],[fruitColor:"
  34. +buffer.toString()+"]");
  35. //判断oType的类型是否是要指定的类型
  36. if(method.getParameterTypes()[0]
  37. .equals("com.kute.test.selfannotation.People.PeopleType")){
  38. oType=(PeopleType)oType;
  39. }
  40. if(method.getParameterTypes()[1]
  41. .equals("java.lang.String")){
  42. oName=oName.toString();
  43. }
  44. //反射调用方法并传递参数
  45. ReflectionUtils.invokeMethod(method,clasz,
  46. newObject[]{oType,oName,oAge,fruitColor});
  47. }
  48. }
  49. }
  50. }catch(Exceptione){
  51. e.printStackTrace();
  52. }
  53. }
  54. }

3、应用注解
  1. packagecom.kute.test.selfannotation;
  2. importjava.io.Serializable;
  3. importorg.slf4j.Logger;
  4. importorg.slf4j.LoggerFactory;
  5. importcom.kute.test.selfannotation.People.PeopleType;
  6. @People(age=20)
  7. publicclassStudentimplementsSerializable{
  8. privatestaticfinallongserialVersionUID=1L;
  9. privatestaticLoggerlogger=LoggerFactory.getLogger(Student.class);
  10. @People(type=PeopleType.GOODMAN,name="kute",age=18,fruitColor={
  11. "blue","white","green"})
  12. publicvoidsetValue(PeopleTypestuType,StringstuName,intstuAge,
  13. String[]fruitColor){
  14. StringBufferbuffer=newStringBuffer();
  15. for(Stringcolor:fruitColor)
  16. buffer.append(color+",");
  17. logger.info("成功调用了方法并注入了参数:["+stuType+","+stuAge+","+stuName
  18. +",{"+buffer.toString()+"}]");
  19. }
  20. }

4、测试
  1. packagetest;
  2. importorg.junit.Test;
  3. importcom.kute.test.selfannotation.AnnotionParse;
  4. importcom.kute.test.selfannotation.Student;
  5. publicclassTestAnnotationParse{
  6. @Test
  7. publicvoidtest(){
  8. AnnotionParseparse=newAnnotionParse();
  9. parse.parse(Student.class);
  10. }
  11. }

5、运行结果
  1. 28[main]INFOcom.kute.test.selfannotation.AnnotionParse-取出了方法的参数:[oType:GOODMAN],[oName:kute],[oAge:18],[fruitColor:blue,white,green,]
  2. 28[main]INFOcom.kute.test.selfannotation.Student-成功调用了方法并注入了参数:[GOODMAN,18,kute,{blue,white,green,}]
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics