一、前言

注解(也称为元数据)为我们在代码中添加信息提供了一种方法,它在 一定程度上将元数据与源代码文件结合在一起。它是从java 5 开始引入的。通过使用注解,我们可以将元数据保存在Java源代码之中,并利用annotation API为注解构造处理工具。

二、语法

●从语法的角度来看,注解的使用方式几乎与修饰符的使用一模一样。它的元素看起来就像接口的方法,唯一的区别是你可以为其指定默认值。

●注解包过三种标准注解和四种元注解,以及自定义注解。

★★★标准注解★★★

@Override:方法的覆盖

@Deprecated:弃用,表示当前api停止使用

@SuppressWarnings:关闭不当的编译器警告信息。

★★★元注解★★★

@Target:表示该注解作用于什么地方

ElementType.FIELD                       // 字段、枚举的常量
  ElementType.METHOD                  // 方法
  ElementType.PARAMETER)          // 方法参数
  ElementType.CONSTRUCTOR     // 构造函数
  ElementType.LOCAL_VARIABLE  // 局部变量
  ElementType.ANNOTATION_TYPE   // 注解
  ElementType.PACKAGE               // 包

@Retention:保存注解信息的级别

RetentionPolicy.SOURCE    // 注解仅存在于源码中,在class字节码文件中不包含
       RetentionPolicy.CLASS     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
       RetentionPolicy.RUNTIME   // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Documented:将此注解包含在Javadoc中

@Inherited:允许子类继承父类中的注解

●编译器对元素的默认值过分挑剔。也就是说,元素要么具有默认值,要么必须在使用注解时提供元素的值。其次,对于非基本类型的元素,无论在源码中声明,还是在注解接口中定义默认值,都不能以null作为其值。为了避开这个约束,可以定义一些特殊的值,如空字符串或是负数,比如(-1)等。这也是在定义注解时,一个习惯用法。

三、自定义注解demo

 @Documented
@Inherited
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Init
{
public String value() default "";
}
 public class User
{
private String name;
private String age;
public String getName()
{
return name;
}
@Init(value = "lee")
public void setName(String name)
{
this.name = name;
}
public String getAge()
{
return age;
}
@Init(value = "66")
public void setAge(String age)
{
this.age = age;
}
}
 public class UserFactory
{
public static User create()
{
User user = new User(); // 获取User类中所有的方法(getDeclaredMethods也行)
Method[] methods = User.class.getMethods(); try
{
for (Method method : methods)
{
// 如果此方法有注解,就把注解里面的数据赋值到user对象
if (method.isAnnotationPresent(Init.class))
{
Init init = method.getAnnotation(Init.class);
method.invoke(user, init.value());
}
}
}
catch (Exception e)
{
e.printStackTrace();
return null;
} return user;
}
}
 public class Test
{
public static void main(String[] args) throws IllegalAccessException,
IllegalArgumentException, InvocationTargetException
{
User user = UserFactory.create(); System.out.println(user.getName());
System.out.println(user.getAge());
}
}

大家可以自己执行代码,看看结果。

参考文章:

《Thinking in Java》

https://www.cnblogs.com/liangweiping/p/3837332.html

----------------------------------------------------------------------

最新文章

  1. sqlmap常用技巧
  2. centos 防火墙设置
  3. 【转】【WPF】MVVM模式的3种command
  4. cocos2d游戏界面卡住声音正常播放的问题分析
  5. 构建高性能web之路------mysql读写分离实战
  6. UVa 1467 (贪心+暴力) Installations
  7. SQL模糊查询与删除多条语句复习
  8. MFC中小笔记(三)
  9. Micropython实例之TPYBoard来电显示功能演示
  10. yum下载安装redis
  11. PhpSpreadsheet处理表格
  12. C# Form Chart X刻度左右多余一格怎么去掉
  13. 用javascript控制svg的图片颜色
  14. [剑指Offer]40-最小的k个数
  15. windows类型
  16. Ural 2040. Palindromes and Super Abilities 2 回文自动机
  17. oracle 插入表数据的4种方式
  18. python学习笔记013——内置函数dir()
  19. mysql 权限处理
  20. SAP MM模块 经常使用Bapi

热门文章

  1. JAVA第2课
  2. webStorm activeCode
  3. Spring Cloud分布式微服务云架构集成项目
  4. uboot中往s5p6818的emmc刷写内容
  5. MyBatis-day2
  6. DevExpress v18.2新版亮点——Reporting篇(一)
  7. 苹果IOS下text-shadow与box-shadow失效的解决办法
  8. pdf.js使用总结#如何在网页读取并显示PDF格式文档
  9. Prime ring problem,递归,广搜,回溯法枚举,很好的题
  10. 开始PYTHON之路