一、前言

注解(也称为元数据)为我们在代码中添加信息提供了一种方法,它在 一定程度上将元数据与源代码文件结合在一起。它是从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

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

java 注解 知识整理的更多相关文章

  1. 2019-9-16 java上课知识整理总结(动手动脑,课后实验)

    java上课知识整理总结(动手动脑,课后实验) 一,课堂测试 1,题目:课堂测试:像二柱子那样,花二十分钟写一个能自动生成30道小学四则运算题目的 “软件” 要求:(1)题目避免重复: (2)可定制( ...

  2. Java并发知识整理

    整理了一下前段时间学习Java并发的笔记,大约有40篇. 1. Java并发基础知识 并发基础(一) 线程介绍 并发基础(二) Thread类的API总结 并发基础(三) java线程优先级 并发基础 ...

  3. java基础知识整理

    java基础入门知识(转载请注明出处.) 1.JVM.JRE和JDK的区别. (1)JVM(Java Virtual Machine):java虚拟机,用于保证java跨平台的特性,java语言是跨平 ...

  4. JAVA hashmap知识整理

    HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题.HashMap的工作原理.ArrayList与Vect ...

  5. java 集合知识整理

    java集合类图 HashMap和Hashtable的区别   HashMap HashTable  继承方式 extends AbstractMap implements Map extends D ...

  6. java基础知识整理:

    一, Java中的继承: 1. final关键字(最终的,不可修改的不可变化的,可以修饰类,方法,变量等): 如果final修饰类的话,这个类不可以被继承: 如果修饰方法的话,这个方法不可以被子类覆盖 ...

  7. Java基础知识整理(一)

    Java开发环境JDK(Java编辑器.Java运行工具(JRE作用).Java文档生成工具.Java打包工具) 1.Java是严格区分大小写的.2.Java程序中一句连续的字符串不能分开在两行书写, ...

  8. Java多线程知识整理

    多线程 1. 多线程基础 多线程状态转换图 普通方法介绍 yeild yeild,线程让步.是当前线程执行完后所有线程又统一回到同一起跑线.让自己或者其他线程运行,并不是单纯的让给其他线程. join ...

  9. Java异常知识整理_处理异常时的性能开销

    1.首先列两个从别的地方看到的说法: try-catch代码段会产生额外的性能开销,或者换个角度说,它往往会影响JVM对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的try包住整段的代码 ...

随机推荐

  1. ESP32搭建3.ubuntu14.04下搭建esp32开发环境 (10-5)

    硬件为乐鑫出品的ESP32一款集成了wifi和蓝牙的集成模块. 1.首先ctrl+alt+t打开终端,sudo -s选择用root权限登陆 . 2. 输入指令:sudo apt-get install ...

  2. Application 、Cookie和 Session 两种会话有什么不同

    Application储存在服务端,没有时间限制,服务器关闭即销毁 Session存储在服务端,客户端,关闭即销毁(长时间不使用,且浏览器未关闭,默认自动销毁时间是20分钟) Cookie储存在客户端 ...

  3. python笔记20-装饰器、作用域

    函数的作用域是就近原则,从里往外找,如果自己函数里有,就拿过来如果自己的函数里面没有的话,就去它父级函数里面找,父亲用不了儿子的,儿子可以用父亲的函数只有被调用才会执行# name = 'python ...

  4. Scrapy的piplines.py存储文件和存储mongodb

    一.将数据保存到文件 1.piplines.py文件 import json class TencentPipeline(object): def open_spider(self,spider): ...

  5. C++二维数组、指针、对象数组、对象指针

    项目中用到,随手记一下: 1.二维数组.与指针 创建二维数组指针的方式: a.已知一维的大小 1 int **array=new int *[rows]; 2 (for int i=0;i<ro ...

  6. 杭电ACM1007

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  7. DevExpress VCL Controls 2019发展路线图(No.2)

    [DevExpress VCL Controls下载] ExpressQuantumTreeList Excel-inspired Filter (v19.1) 与ExpressQuantumGrid ...

  8. SSM excel文件的导入导出

    对于excel文件的导入导出,后台接收读取和建表封存都是固定死的,所以对于excel导入时,excel文件内容必须匹配后台相关对象,不然报错. excel文件导出,用<a><a/&g ...

  9. Fasttext原理

    fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率.序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签.fastText 在 ...

  10. 运维ip语法,DNS配置方法

    修改配置文件: /etc/resolv.conf nameserver DNS_IP_1 nameserver DNS_IP_2 nameserver 指定本机解析: /etc/hosts 主机IP ...