1.定义一个枚举类,后面自定义注解时使用

  1. package cn.tx.annotation.enums;
  2. /**
  3. * 定义枚举类型
  4. * @author Administrator
  5. *
  6. */
  7. public enum HttpMethod {
  8.  
  9. GET,POST,PUT,INPUT,DELETE;
  10. }

2. 自定义一个注解 AnnoTest

  1. package cn.tx.annotation;
  2.  
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.ElementType;
  5. import java.lang.annotation.Retention;
  6. import java.lang.annotation.RetentionPolicy;
  7. import java.lang.annotation.Target;
  8.  
  9. import cn.tx.annotation.enums.HttpMethod;
  10.  
  11. /**
  12. * 1.自定义注解,自动实现了java.lang.Annotation接口
  13. * @author Administrator
  14. * 2.注解内部可以定义值,这里的值既不是属性,也不是方法
  15. * 3.语法:数据类型 值的名字();
  16. * 4.注解的意义:当非标识性注解(内部有值的注解)标注在方法上时,当方法被反射调用时,注解才有意义
  17. * 5.@Retention 注解
  18. * @Retention(RetentionPolicy.RUNTIME)
  19. * @Target(ElementType.ANNOTATION_TYPE) public @interface Retention {
  20. * RetentionPolicy value(); }
  21. * RetentionPolicy:注解的策略
  22. * RetentionPolicy.CLASS 表示这个注解能被编译到class文件里,但是运行时不参与运行
  23. * 6.@Target注解——指示注解类型所适用的程序元素的种类
  24. * @Documented
  25. @Retention(RetentionPolicy.RUNTIME)
  26. @Target(ElementType.ANNOTATION_TYPE)
  27. public @interface Target {
  28. ElementType[] value();
  29. ElementType是一个枚举类型
  30. }
  31. * 7. @Target @Retention 只能用在注解的定义上面
  32. * 8.@Documented 指明该注解将被包含在javadoc中
  33. */
  34.  
  35. //ElementType.METHOD,表示AnnoTest只能放在方法上面,不能放在类,属性等其他上面
  36. @Target(value = { ElementType.METHOD,ElementType.TYPE })
  37. @Retention(value = RetentionPolicy.RUNTIME)
  38. public @interface AnnoTest {
  39.  
  40. String value();//这里定义了值,在使用注解的地方,就得加上这个值
  41.  
  42. // Class[]/*String[]*/ location();
  43.  
  44. // HttpMethod method();
  45.  
  46. }
  47.  
  48. // enum ElementType {
  49. // /**类,接口,枚举声明 Class, interface (including annotation type), or enum declaration */
  50. // TYPE,
  51. // /**字段声明,包括枚举常量 Field declaration (includes enum constants) */
  52. // FIELD,
  53. // /**方法声明 Method declaration */
  54. // METHOD,
  55. // /** Parameter declaration */
  56. // PARAMETER,
  57. // /** 构造方法声明 Constructor declaration */
  58. // CONSTRUCTOR,
  59. // /**局部变量声明 Local variable declaration */
  60. // LOCAL_VARIABLE,
  61. // /**注解类型声明 Annotation type declaration */
  62. // ANNOTATION_TYPE,
  63. // /**包声明 Package declaration */
  64. // PACKAGE
  65. //}

3.  定义一个Claculate类,对方法使用自定义注解(前提是AnnoTest 注解 设置的@Target(value = { ElementType.METHOD,ElementType.TYPE })  ,也就是该注解能被使用在方法上面。)

  1. package cn.tx.annotation.test;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Target;
  5.  
  6. import cn.tx.annotation.AnnoTest;
  7.  
  8. public class Caculate {
  9. // @AnnoTest(value = "sss")
  10. //AnnoTest注解中定义了@Target(value = { ElementType.METHOD,ElementType.TYPE })
  11. //如果在属性a上面加@AnnoTest注解,会报:The annotation @AnnoTest is disallowed for this location
  12. private int a;
  13.  
  14. @AnnoTest(value = "相加的结果是:")
  15. public int add(int a,int b){
  16. return a+b;
  17. }
  18.  
  19. }

4. junit测试类:

  1. package cn.tx.annotation.test;
  2.  
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.ElementType;
  5. import java.lang.annotation.Retention;
  6. import java.lang.annotation.RetentionPolicy;
  7. import java.lang.annotation.Target;
  8. import java.lang.reflect.Method;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11.  
  12. import cn.tx.annotation.AnnoTest;
  13. import cn.tx.annotation.enums.HttpMethod;
  14.  
  15. /**
  16. * 常用的表标识性注解:@Test @Override @SuppressWarnings
  17. *
  18. * @author Administrator
  19. *
  20. */
  21. public class Test {
  22.  
  23. @org.junit.Test
  24. public void test() {
  25.  
  26. }
  27.  
  28. // @AnnoTest(value = "tst")
  29. @Deprecated
  30. // 过时,不建议使用的注解
  31. public void method() {
  32.  
  33. }
  34.  
  35. /**
  36. * @SuppressWarnings压制警告的注解 unchecked 不检查操作时的警告 rawtypes
  37. * 原始类型,也就是不使用泛型,在定义的时候压制泛型的警告
  38. */
  39. @SuppressWarnings( { "unchecked", "rawtypes" })
  40. public void method1() {
  41. @SuppressWarnings("unused")
  42. List list = new ArrayList();// 不写泛型类型时,会出现黄色波浪线警告!
  43. list.add("lisi");
  44. }
  45.  
  46. @org.junit.Test
  47. // @AnnoTest(value = "test", location = { String.class }, method = HttpMethod.GET)
  48. // 非标识性注解的意义在于方法被反射调用时
  49. public void method3() {
  50.  
  51. }
  52.  
  53. @org.junit.Test
  54. public void testEnum() {
  55. System.out.println(HttpMethod.GET); //执行该方法,控制台打印GET
  56. }
  57.  
  58. @org.junit.Test
  59. public void testAdd(){
  60. new Caculate().add(3, 5); //正常调用,add方法上面的注解不会起作用
  61. }
  62.  
  63. @org.junit.Test
  64. public void testAdd1(){
  65. //获取Caculate类的Class对象,进而获得一个实例,然后获取声明的方法及方法上的注解
  66. Class<?> clazz = Caculate.class;
  67. try {
  68. Object obj = clazz.newInstance();
  69. //getFields()只能获取public的字段,包括父类的。getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。
  70. Method method = clazz.getDeclaredMethod("add", int.class,int.class);
  71. //判断一个方法上面是否存在某个注解
  72. boolean isPres = method.isAnnotationPresent(AnnoTest.class);
  73. if(isPres){
  74. //根据一个类获取注解 ,即获得@AnnoTest
  75. AnnoTest annotation = method.getAnnotation(AnnoTest.class);
  76. //获得注解上的值
  77. String value = annotation.value(); //
  78. //反射的方式调用add()方法
  79. Object result = method.invoke(obj, 2,3);
  80. System.out.println(value+result); //控制台输出结果为: 相加的结果是:5
  81. //如果注解上的@Retention(value = RetentionPolicy.SOURCE),运行时时不会有结果的
  82. }
  83.  
  84. } catch (Exception e) {
  85. e.printStackTrace();
  86. }
  87.  
  88. }
  89.  
  90. }

Java自定义注解学习的更多相关文章

  1. java自定义注解学习(二)_注解详解

    上篇文章,我们简单的实现了一个自定义注解,相信大家对自定义注解有了个简单的认识,这篇,这样介绍下注解中的元注解和内置注解 整体图示 内置注解 @Override 重写覆盖 这个注解大家应该经常用到,主 ...

  2. java自定义注解学习(一)_demo小练习

    自定义注解 现在大家开发过程中,经常会用到注解. 比如@Controller 等等,但是有时候也会碰到自定义注解,在开发中公司的记录日志就用到了自定义注解.身为渣渣猿还是有必要学习下自定义注解的. 这 ...

  3. java自定义注解学习(三)_注解解析及应用

    上篇文章已经介绍了注解的基本构成信息.这篇文章,主要介绍注解的解析.毕竟你只声明了注解,是没有用的.需要进行解析.主要就是利用反射机制在运行时进行查看和利用这些信息 常用方法汇总 在Class.Fie ...

  4. java自定义注解学习(注解处理器)

    如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...

  5. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  6. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  7. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  8. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  9. Java自定义注解的实现

    Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException): 1.首先编写一个自定义注解@RandomlyThrowsException package com.gi ...

随机推荐

  1. 2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)

    http://acm.hdu.edu.cn/showproblem.php?pid=6562 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, 使得这个数变成 dsiddsid的形式 ...

  2. CodeChef FNCS (分块+树状数组)

    题目:https://www.codechef.com/problems/FNCS 题解: 我们知道要求区间和的时候,我们用前缀和去优化.这里也是一样,我们要求第 l 个函数到第 r 个函数 [l, ...

  3. CSU 1556 Jerry's trouble

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1556 Description Jerry is caught by Tom. He ...

  4. ruby的next if boolean

    next相当于continue

  5. 《图解设计模式》读书笔记2-1 Template Method模式

    目录 模板方法模式 类图 思想: 模板方法模式 在父类中定义流程,在子类中实现具体的方法. 类图 代码 //抽象类 public abstract class AbstractDisplay { pu ...

  6. C# 做延迟,但系统又能同时能执行其它任务

    private void Delay(int Millisecond) //使用时直接调用即可 { DateTime current = DateTime.Now; while (current.Ad ...

  7. python安装centos7

    1.安装git (需root权限) yum -y install git 2.安装依赖包 yum -y install gcc make patch gdbm-devel openssl-devel ...

  8. Selenium WebDriver高级应用

    WebDriver高级应用 public class Demo4 { WebDriver driver; // @BeforeMethod:在每个测试方法开始运行前执行 @BeforeMethod p ...

  9. JSP表单提交 与 接受显示

    Demo01.jsp 提交表单输入的信息至 Demo02.jsp方法一 1 <%@ page language="java" contentType="text/h ...

  10. (appium+python)UI自动化_03_元素定位工具

    前言 在UI自动化过程中,需要对手机app上的元素进行定位,然后进一步编写自动化脚本操作app.定位元素首先需要定位工具来辅助查看页面元素.小编常用的定位工具有2种,分别是uiautomatorvie ...