关于注解的学习

1.注解的认识

注解的本质是一个继承了Annotation的特殊接口,具体类是在java运行时通过动态生成的代理类,当我们通过反射方法反射回来的是一个Proxy$1的代理对象,通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler的invoke方法。该方法会从memberValues这个Map中索引出对应的值。而memberValues的来源是Java常量

2.代码示例

注解与普通的修饰符的使用没有太大的区别

public class TestDemo{
	@test
	public void test()
	{
			System.out.println("test");
	}
	@suppressWarnings("uncheck")
	public void noCheckMethod()
	{
		......
	}
}

例如上面的@test,@supperssWarnings,@override等注解都是我们平常代码中经常用到的普通注解

3.注解的基本语法

@target(ElementType.type)
@retention(Retentionpolicy.RUNTIME)
public @interface test{
		String name() default "";
		String value();
}

1.上面代码创建了一个名为test的注解
@target
是java5添加的元注解,他负责约束该注解所能使用的地方例如:方法,字段,类等
(来源于:https://blog.csdn.net/lixiaoxiong55/article/details/81435829)

public enum ElementType {
   /**标明该注解可以用于类、接口(包括注解类型)或enum声明*/
   TYPE,
 
   /** 标明该注解可以用于字段(域)声明,包括enum实例 */
   FIELD,
 
   /** 标明该注解可以用于方法声明 */
   METHOD,
 
   /** 标明该注解可以用于参数声明 */
   PARAMETER,
 
   /** 标明注解可以用于构造函数声明 */
   CONSTRUCTOR,
 
   /** 标明注解可以用于局部变量声明 */
   LOCAL_VARIABLE,
 
   /** 标明注解可以用于注解声明(应用于另一个注解上)*/
   ANNOTATION_TYPE,
 
   /** 标明注解可以用于包声明 */
   PACKAGE,
 
   /**
    * 标明注解可以用于类型参数声明(1.8新加入)
    * @since 1.8
    */
   TYPE_PARAMETER,
 
   /**
    * 类型使用声明(1.8新加入)
    * @since 1.8
    */
   TYPE_USE
}

@retetion
该注解用来约束自定义注解的生命周期
共有三个值:源码级(RetetionPolicy.SOURCE),类文件级别(RetetionPolicy.CLASS),运行级(RetetionPolicy.RUNTIME)

  • SOURCE:保存在java文件中,在编译成class文件时被丢弃,SOURCE一般用于标记,比如javadoc,或为了其他人易于理解你的程序,如@Override等。
  • CLASS:在class文件中保存,会被JVM丢弃。CLASS用处暂时不知待补
  • RUNTIME:注解信息将在运行期(JVM)也保留,因此可以通过反射机制读取注解的信息(源码、class文件和执行的时候都有注解的信息),如SpringMvc中的@Controller、@Autowired、@RequestMapping等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值