《Java基础知识》Java注解"@"详解
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注解"@"详解的更多相关文章
- Java基础-面向接口编程-JDBC详解
Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...
- java基础(3)--详解String
java基础(3)--详解String 其实与八大基本数据类型一样,String也是我们日常中使用非常频繁的对象,但知其然更要知其所以然,现在就去阅读源码深入了解一下String类对象,并解决一些我由 ...
- Linux基础知识之挂载详解(mount,umount及开机自动挂载)
Linux基础知识之挂载详解(mount,umount及开机自动挂载) 转载自:http://www.linuxidc.com/Linux/2016-08/134666.htm 挂载概念简述: 根文件 ...
- JAVA基础知识|java虚拟机(JVM)
一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...
- Java基础13:反射详解
本节主要介绍Java反射的原理,使用方法以及相关的技术细节,并且介绍了关于Class类,注解等内容. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech ...
- Java枚举类与注解详解——一篇文章读懂枚举类与注解详
目录 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举类实现接口 二.注解 ① 生成文档相关注解 ②注解在编译时进行格式检查 ③注解跟踪代码的 ...
- [java基础知识]java安装步骤
jre: java运行环境. jre = java虚拟机 + 核心类库(辅助java虚拟机运行的文件).如果只是运行java程序,只需要安装jre. jdk: java开发工具集 jd ...
- java基础知识——Java的定义,特点和技术平台
(作者声明:对于Java编程语言,很多人只知道怎么用,却对其了解甚少.我也是其中一员.所以菜鸟的我,去查询了教科书以及大神的总结,主要参考了<Java核心技术>这本神作.现在分享给大家!) ...
- 计算机基础知识和tcp详解
计算机基础知识 作为应用软件开发程序员是写应用软件的,而应用软件必须应用在操作系统之上,调用操作系统接口,由操作系统控制硬件 比如客户端软件想要基于网络发送一条消息给服务端软件,流程是: 1.客户端软 ...
- OpenStack基础知识-tox的详解介绍
1.tox简介 tox是通用的虚拟环境管理和测试命令行工具.tox能够让我们在同一个Host上自定义出多套相互独立且隔离的python环境,每套虚拟环境中可能使用了不同的 Python 拦截器/环境变 ...
随机推荐
- vue中动态加载img
想实现动态加载图片,当点击“首页”时,图片变色 代码如下: <mt-tabbar v-model="selected" fixed class="border-1p ...
- Java描述设计模式(23):访问者模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 电竞是游戏比赛达到"竞技"层面的体育项目.利用电子设备作为运动器械进行的.人与人之间的智力对抗 ...
- SCAU-1076 K尾相等数
代码借鉴SCAU-OJ(感谢!!) 题目:1076 K尾相等数 时间限制:500MS 内存限制:65536K提交次数:251 通过次数:80 题型: 编程题 语言: G++;GCC Desc ...
- Selenium多层级的iframe中元素的定位
很多时候我们遇到多层级的iframe就会想各种方法去获取iframe中的元素,但其实很简单就可以做到的,就是一级一级获取就可以了,获取至你需要的那个层级即可,下面看下实际的案例:(转) <fra ...
- Java秋招面试复习大纲(二):Spring全家桶+MyBatis+MongDB+微服务
前言 对于那些想面试高级 Java 岗位的同学来说,除了算法属于比较「天方夜谭」的题目外,剩下针对实际工作的题目就属于真正的本事了,热门技术的细节和难点成为了面试时主要考察的内容. 这里说「天方夜谭」 ...
- 虚拟机中linux操作系统raid10(5块磁盘)配置流程及损坏磁盘的移除
打开所要用的虚拟机,点击编辑虚拟机设置,点击硬盘,添加 2.一直点击下一步不做修改,直到最后完成 3.按照以上步骤添加5块磁盘 4.点击开启虚拟机,输入用户名root密码登录进去 5.进入虚拟机后,鼠 ...
- Java8 格式化时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");LocalDateTime. ...
- Codeforces Round #452 (Div. 2) A B C
Codeforces Round #452 (Div. 2) A Splitting in Teams 题目链接: http://codeforces.com/contest/899/problem/ ...
- 目标检测 1 : 目标检测中的Anchor详解
咸鱼了半年,年底了,把这半年做的关于目标的检测的内容总结下. 本文主要有两部分: 目标检测中的边框表示 Anchor相关的问题,R-CNN,SSD,YOLO 中的anchor 目标检测中的边框表示 目 ...
- RubyGem 下载时连接失败的解决方法
RubyGem 下载 gem 包失败,有一定原因是 https 导致的. 搜索了很久,找到一个解决的方法. 1.下载 cacert.pem,也就是 curl 的证书. http://curl.haxx ...