博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java注解基本知识
阅读量:6474 次
发布时间:2019-06-23

本文共 2664 字,大约阅读时间需要 8 分钟。

hot3.png

@RequestMapping("/addActivity.ajax")@ResponseBodypubli void addActivity(Activity activity){}

这是spring mvc Controller 中的注解 意思是下面的方法(addActivity)处理addActivity.ajax的请求,不止是spring mvc,在整个spring 体系中,包括其他框架中都有大量用到注解,那我们现在来了解下注解的知识.

注解的建立

    

 快捷键 Ctrl+N 选择Annoation

元注解

             1.

    2.@Retention,
    3.@Documented,
    4.@Inherited

                这是Java的四个元注解,可以用来修饰我们自己定义的注解,也可以理解成注解的注解,

       ,@Retention比较常见

@Retention

   这个注解表明会被保留到哪个阶段. 有三个值:

   RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略
   RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略
   RetentionPolicy.RUNTIME —— 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他      使用反射机制的代码所读取和使用.

   一般我们用到自定义注解的时候都会用到反射,所以创建字自定义注解时一般设置成RUNTIME级别

  如果没设置@Retention 则默认为 RetentionPolicy.CLASS。

@Target

   用于描述注解的使用范围(可以作用于java的那个部分,比如修饰变量的注解是不能修饰方法的,注解可以修饰什么地方就是由@Target决定的)

             1.CONSTRUCTOR:用于描述构造器

    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface TargetField {  public String desc() default "这个注解修饰作用类里面的域变量";}
public class Targetdesc {	@TargetField(desc="实例变量")	private String classparam;		@TargetField(desc="静态变量也可以")	private static int age;	    @TargetConstructor(desc="构造函数")	public Targetdesc() {				// TODO Auto-generated constructor stub	}    public static void fun1(@TargetParameter(desc="方法参数一") String param){    	@TargetLocal_variable(desc="方法内部变量")    	String local_variable = "";    }	@TargetMethod(desc="方法")    public void fun2(){		/*@TargetField(desc="静态变量也可以") TargetField 不能修饰方法内部变量*/		String local_variable = "";    }	}

    注解也可以修饰多个地方

@Target({ElementType.CONSTRUCTOR,ElementType.FIELD})

注解处理器

  回到最前面的例子,后台接收到addActivity.ajax请求后会调用addActivity方法,那我们是不是首先得取到

@RequestMapping(spring mvc实现的自定义注解)注解的值,这样才能跟请求的入参匹配.

   那么我们来获取注解里面的值。

   我的做法是这样的,

  1 首先通过获取所要获取的注解作用的Java里面的结构(好吧我不太知道怎样去描述  就是说我们要获取的        注解只作用于方法 那就首先获取类的方法,要是作用于域那就获取类的域)。

  2 在第一步的基础上获取注解

  我们用代码来描述下吧

public static void main(String[] args) {				// TODO Auto-generated method stub		      for(Field f:Targetdesc.class.getDeclaredFields()){//获取作用变量上的注解	    	  //TargetField是作用在变量上的注解名 注解也是类	    	  TargetField TargetField = f.getAnnotation(TargetField.class);			   if (TargetField != null) {		             System.out.println(TargetField.desc());		                 		       }		   }	      for(Method m:Targetdesc.class.getDeclaredMethods()){	    	  TargetMethod fargetMethod =m.getAnnotation(TargetMethod.class);	    	  if (fargetMethod != null) {	    		  System.out.println(fargetMethod.desc());	    		  	    	  }	      }		  	}

打印出来的结果就是上述代码中注解的desc值

类变量静态变量也可以方法

转载于:https://my.oschina.net/u/1377006/blog/785362

你可能感兴趣的文章
tomcat类加载机制
查看>>
ado.net2.0中的缓存使用SqlDependency类
查看>>
Java基础学习总结(94)——Java线程再学习
查看>>
iOS开发之调用系统设置
查看>>
利用 ACPI\\ACPI0003设备 判断笔记本还是台式机
查看>>
解决wampserver 服务无法启动
查看>>
ES6中Promise封装ajax的写法
查看>>
初次使用 VUX
查看>>
javascript 字符串转数字的简便写法
查看>>
0404《构建之法》第四章读后感
查看>>
html之div始终停留在屏幕中间部分
查看>>
AsyncTask的缺陷
查看>>
Spring中jdbcTemplate的用户实例
查看>>
[模板] 快速傅里叶变换/FFT/NTT
查看>>
DecimalFormat 数据格式设置 SimpleDateFormat时间格式的用法介绍 --转载
查看>>
Android 的Margin和Padding属性以及支持的长度单位
查看>>
653. Two Sum IV - Input is a BST
查看>>
HDU ACM 1050 Moving Tables
查看>>
Django templates加载css/js/image等静态资源
查看>>
Eclipse C + GTK2.0环境构筑
查看>>