Java注解含义:

Java注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的。
Java注解又叫java标注,java提供了一套机制,使得我们可以对方法、类、参数、包、域以及变量等添加标准(即附上某些信息)。且在以后某个时段通过反射将标注的信息提取出来以供使用。

样例(实现一个自己的注解):

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(value = {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotaion {
String value();
}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(value = {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyFieldAnnotaion {
String value();
String type();
String lengths();
}
import java.io.Serializable;

@MyAnnotaion("student")
public class Student implements Serializable { private static final long serialVersionUID = 1L; @MyFieldAnnotaion(value = "1",type = "int",lengths = "10")
String id;
@MyFieldAnnotaion(value = "蕾蕾",type = "String" ,lengths = "200")
String name; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
import org.apache.poi.ss.formula.functions.T;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field; /**
* 通过反射获取注解
*/
public class AnnotaionDemo {
public static void main(String[] args) throws Exception {
Class<T> clazz = (Class<T>) Class.forName("demo.knowledgepoints.annotation.Student");
//判断注解是否存在
if(clazz.isAnnotationPresent(MyAnnotaion.class)){
System.out.println("存在注解:MyAnnotaion");
} //获取注解列表
Annotation[] annotaions = clazz.getAnnotations();
for (int i = 0; i < annotaions.length; i++) {
System.out.println("注解:"+annotaions[i]);
} //获取注解内容
MyAnnotaion myAnnotaion = clazz.getAnnotation(MyAnnotaion.class) ;
System.out.println("注解的值为:"+myAnnotaion.value()); //获取方法上的注解内容
Field field = clazz.getDeclaredField("id"); //方法上注解是否存在
field.isAnnotationPresent(MyFieldAnnotaion.class);
//方法注解列表
field.getAnnotations(); //获取方法上的注解内容
MyFieldAnnotaion myFieldAnnotaion = field.getAnnotation(MyFieldAnnotaion.class);
System.out.println("value:"+myFieldAnnotaion.value()+"; type:"+myFieldAnnotaion.type()+"; lengths:"+myFieldAnnotaion.lengths());
}
}

运行结果:

根据这个案例:

1. 注解实现需要关键字:@interface;

2. 在注解上我们还使用了注解 @Target,@Retention。这些被称为元注解,

Java中元注解有四个: @Retention @Target @Document @Inherited;

@Retention:注解的保留位置

@Retention(RetentionPolicy.SOURCE)   //注解仅存在于源码中,在class字节码文件中不包含

     @Retention(RetentionPolicy.CLASS)     // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,

     @Retention(RetentionPolicy.RUNTIME)  // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target:注解的作用目标

@Target(ElementType.TYPE)   //接口、类、枚举

@Target(ElementType.FIELD) //字段、枚举的常量

@Target(ElementType.METHOD) //方法

@Target(ElementType.PARAMETER) //方法参数

@Target(ElementType.CONSTRUCTOR)  //构造函数

@Target(ElementType.LOCAL_VARIABLE)//局部变量

@Target(ElementType.ANNOTATION_TYPE)//注解

@Target(ElementType.PACKAGE) ///包

@Document:说明该注解将被包含在javadoc中

@Inherited:说明子类可以继承父类中的该注解

3. 直接里面可以写方法:String value();

外部使用注解可以将值写入,后续可以拿到该值进行使用。

可以提供默认值: String value() default "花花";   

修改 AnnotaionDemo 的方法实现一个常用功能,通过注解将值注入实体类中:

import org.apache.poi.ss.formula.functions.T;

import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* 通过反射获取注解
*/
public class AnnotaionDemo {
public static void main(String[] args) throws Exception {
Student student = (Student) getbean("demo.knowledgepoints.annotation.Student");
System.out.println(student);
} public static Object getbean(String className) throws Exception{
Class<T> clazz = (Class<T>) Class.forName(className);
//判断注解是否存在(该注解被当成标记使用)
if(!clazz.isAnnotationPresent(MyAnnotaion.class)){
throw new Exception("该类缺失注解“MyAnnotaion”,不能通过反射获取bean");
} //创建实体类
Object object = clazz.newInstance(); Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
//获取字段名
String name = fields[i].getName(); //过滤序列
if (name.equals("serialVersionUID")) {
continue;
} //组装SET方法
Class<?> type = clazz.getDeclaredField(name).getType(); // 首字母大写
String replace = name.substring(0, 1).toUpperCase()
+ name.substring(1);
Method setMethod = clazz.getMethod("set" + replace, type);
//获取字段值
Field field = clazz.getDeclaredField(name);
MyFieldAnnotaion myFieldAnnotaion = field.getAnnotation(MyFieldAnnotaion.class);
String value = myFieldAnnotaion.value();
//执行set方法
if (value != null && !"".equals(value)) {
// ---判断读取数据的类型(判断部分类型)
if (type.isAssignableFrom(String.class)) {
setMethod.invoke(object, value);
} else if (type.isAssignableFrom(int.class)
|| type.isAssignableFrom(Integer.class)) {
setMethod.invoke(object, Integer.parseInt(value));
} else if (type.isAssignableFrom(Double.class)
|| type.isAssignableFrom(double.class)) {
setMethod.invoke(object, Double.parseDouble(value));
} else if (type.isAssignableFrom(Boolean.class)
|| type.isAssignableFrom(boolean.class)) {
setMethod.invoke(object, Boolean.parseBoolean(value));
}
}
}
return object;
}
}

运行结果:

案例中使用了反射:反射详解:https://www.cnblogs.com/jssj/p/11723910.html

总结语:注解功能在框架开发中被广泛使用:例如Spring,MyBatis等。注解的出现大大的减少了开发工作中的开发工作量。

《Java基础知识》Java注解"@"详解的更多相关文章

  1. Java基础-面向接口编程-JDBC详解

    Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...

  2. java基础(3)--详解String

    java基础(3)--详解String 其实与八大基本数据类型一样,String也是我们日常中使用非常频繁的对象,但知其然更要知其所以然,现在就去阅读源码深入了解一下String类对象,并解决一些我由 ...

  3. Linux基础知识之挂载详解(mount,umount及开机自动挂载)

    Linux基础知识之挂载详解(mount,umount及开机自动挂载) 转载自:http://www.linuxidc.com/Linux/2016-08/134666.htm 挂载概念简述: 根文件 ...

  4. JAVA基础知识|java虚拟机(JVM)

    一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...

  5. Java基础13:反射详解

    本节主要介绍Java反射的原理,使用方法以及相关的技术细节,并且介绍了关于Class类,注解等内容. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech ...

  6. Java枚举类与注解详解——一篇文章读懂枚举类与注解详

    目录 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举类实现接口 二.注解 ① 生成文档相关注解 ②注解在编译时进行格式检查 ③注解跟踪代码的 ...

  7. [java基础知识]java安装步骤

    jre:  java运行环境.  jre =  java虚拟机 + 核心类库(辅助java虚拟机运行的文件).如果只是运行java程序,只需要安装jre.    jdk: java开发工具集   jd ...

  8. java基础知识——Java的定义,特点和技术平台

    (作者声明:对于Java编程语言,很多人只知道怎么用,却对其了解甚少.我也是其中一员.所以菜鸟的我,去查询了教科书以及大神的总结,主要参考了<Java核心技术>这本神作.现在分享给大家!) ...

  9. 计算机基础知识和tcp详解

    计算机基础知识 作为应用软件开发程序员是写应用软件的,而应用软件必须应用在操作系统之上,调用操作系统接口,由操作系统控制硬件 比如客户端软件想要基于网络发送一条消息给服务端软件,流程是: 1.客户端软 ...

  10. OpenStack基础知识-tox的详解介绍

    1.tox简介 tox是通用的虚拟环境管理和测试命令行工具.tox能够让我们在同一个Host上自定义出多套相互独立且隔离的python环境,每套虚拟环境中可能使用了不同的 Python 拦截器/环境变 ...

随机推荐

  1. H3C 交换机设置本地用户和telnet远程登录配置 v7 版本

    H3C 交换机设置本地用户和telnet远程登录配置   v7版本 一.配置远程用户密码与本地用户一致 [H3C]telnet server en //开启Telnet 服务 [H3C]local-u ...

  2. 剑指Offer-32.丑数(C++/Java)

    题目: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 分析: ...

  3. int main (int argc, const char * argv[0]) 中参数的含义;指针数组和数组指针

    恩,有的编译器初始化时候会产生这样的参数 argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数是程序的全名 1. 几种C++ 常见的参数种类 int main(void); in ...

  4. 本地Docker Jenkins构建dotnet core web应用到Linux服务器 Docker上

    1.准备工作 环境 本地: Windows.Docker 代码仓库:Git 服务器:Linux.Docker 前提准备 创建个有dockerfile文件的dotnet core 3 web项目 新建一 ...

  5. JAVA中空指针异常报错的几种可能坑你的情况

    一.局部变量覆盖掉其他变量导致无法使用. 在做Java客户管理的项目的时候,eclipse报出了个空指针异常的错误,但反复检查也并没感觉出错误,调用的数组给它初始化而且赋值了,但是编译器很顽强的报了一 ...

  6. 【读一本书】《昇腾AI处理器架构与编程》--神经网络基础知识(2)

    1 卷积神经网络:输入层 之前提到多层感知机的参数太多,导致训练耗时长并且对图像处理也不具有优势,因此大神们 就提出了多层神经网络,其中最经典的是卷积神经网络(Convolution Neural N ...

  7. pycharm中启动Django方法

    1.找到Edit Configurations 2.Parameters处添加  runserver 0.0.0.0:8080 3.运行成功

  8. luogu P5514 [MtOI2019]永夜的报应

    题目背景 在这世上有一乡一林一竹亭,也有一主一仆一仇敌. 有人曾经想拍下他们的身影,却被可爱的兔子迷惑了心神. 那些迷途中的人啊,终究会消失在不灭的永夜中-- 题目描述 蓬莱山 辉夜(Kaguya)手 ...

  9. react-native布局中的层级问题(zIndex,elevation)

    目录 关于层级的zIndex/elevation 1.zIndex是rn在0.30开始支持的属性,是可以生效的: 2.shadow和elevation 结论 关于层级的zIndex/elevation ...

  10. Servlet和Tomcat底层源码分析

    Servlet 源码分析   Servlet 结构图 Servlet 和 ServletConfig 都是顶层接口,而 GenericServlet 实现了这两个顶层接口,然后HttpServlet ...