java注解的实质,何为注解
注解就是贴标签
(1)注解的作用
1,生成文档。如常用的@param
2,跟踪代码依赖性,实现替代文件的功能。在spring中,主要是减少配置。
3,编译时进行格式检查。如常用的@override
(2)注解的分类
1)按照运行机制划分:
【源码注解→编译时注解→运行时注解】
源码注解:只在源码中存在,编译成.class文件就不存在了。
编译时注解:在源码和.class文件中都存在。像前面的@Override、@Deprecated、@SuppressWarnings,他们都属于编译时注解。
运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。像@Autowired自动注入的这样一种注解就属于运行时注解,它会在程序运行的时候把你的成员变量自动的注入进来。
2)按照来源划分:
【来自JDK的注解——来自第三方的注解——自定义注解】
3)元注解:
元注解是给注解进行注解,可以理解为注解的注解就是元注解。
(3)java中常见的注解
1,JDK的注解
@override标记该方法为覆盖方法
@Deprecated标记该方法已经过时
@SuppressWarning()表示忽略警告
2,java第三方注解
Spring的注解
@Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
Mybatis的注解
@InserProvider 注解为增加
@UpdateProvider 注解为更新
@Options设置缓存时间
Ps:常用增删改查:@InsertProvider,@DeleteProvider@UpdateProvider和@SelectProvider
3,元注解
四个元注解分别是:
@Target
@Retention,
@Documented,
@Inherited
元注解是java API提供,是专门用来定义注解的注解,其作用分别如下:
@Target 表示该注解用于什么地方,可能的值在枚举类
ElemenetType 中,包括:
ElemenetType.CONSTRUCTOR----------------------------构造器声明
ElemenetType.FIELD
--------------------------------------域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE-------------------------
局部变量声明
ElemenetType.METHOD
----------------------------------方法声明
ElemenetType.PACKAGE
--------------------------------- 包声明
ElemenetType.PARAMETER
------------------------------参数声明
ElemenetType.TYPE---------------------------------------
类,接口(包括注解类型)或enum声明
@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括:
RetentionPolicy.SOURCE
---------------------------------注解将被编译器丢弃
RetentionPolicy.CLASS
-----------------------------------注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM-------将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
@Inherited 允许子类继承父类中的注解。
4,自定义注解
例子:
定义:
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented public
@interface Description {
String desc();
String author();
int age() default 18;
}
测试:
@Description(desc="i
am Color",author="boy",age=18)
public
String Color() {
return "red";
}
因为我们前面定义的作用域是在方法和类接口上,所以这个注解在Color()方法上使用是没问题的
使用自定义注解:
使用注解的语法:
@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,...)
案例:
@Description(desc="i
am Color",author="boy",age=18)
public
String Color() {
return "red";
}
这里的Description是我们刚才在自定义注解语法要求里面定义的注解噢,然后我们可以给它的每一个成员变量赋值,注意数据类型。值得注意的是,因为我们前面定义的作用域是在方法和类接口上,所以这个注解在Color()方法上使用是没问题的。
解析注解
概念:
通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。
实例:
1、创建@Table注解
package person.lb.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 表名
* @author nobounds
*
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value() default "";
}
2、创建@Column注解:
package person.lb.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 字段
* @author nobounds
*
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String name() default "";
String dataType() default "varchar(20)";
String comment() default "";
}
3、创建实体类Users:
package person.lb.annotation;
@Table("users")
public class Users {
@Column(name="ID", dataType="int")
private int id;
@Column(comment="用户名")
private String userName;
@Column(name="pwd", comment="密码")
private String password;
@Column(dataType="varchar(25)", comment="邮箱")
private String email;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
4、创建注解处理器AnnotationHandler:
package person.lb.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
public class AnnotationHandler {
public static void main(String[] args) {
StringBuilder sql = new StringBuilder("CREATE TABLE ");
try {
Class clazz = Class.forName("person.lb.annotation.Users");
//获取Users类上的Table注解
Table tableAnnotation = (Table) clazz.getAnnotation(Table.class);
//获取表名
String tableName = tableAnnotation.value().toUpperCase();
if("".equals(tableName)) {
tableName = clazz.getName().toUpperCase();
}
sql.append(tableName);
sql.append(" ( \n");
//获取类中的所有字段
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields) {
//获取字段上的所有注解
Annotation[] fieldAnnotations = field.getAnnotations();
if(fieldAnnotations.length > 0) {
//遍历注解
for(Annotation fieldAnnotation : fieldAnnotations) {
//如果是@Field注解,那么进行处理
if(fieldAnnotation instanceof Column) {
//获取字段名
String columnName = ((Column) fieldAnnotation).name().toUpperCase();
if("".equals(columnName)) {
columnName = field.getName().toUpperCase();
}
//获取数据类型
String dataType = ((Column) fieldAnnotation).dataType().toUpperCase();
//获取注释
String comment = ((Column) fieldAnnotation).comment();
if("".equals(comment)) {
sql.append(columnName + "\t" + dataType + ",\n");
} else {
sql.append(columnName + "\t" + dataType + " COMMENT '" + comment + "',\n");
}
}
}
}
}
sql.append(" ) ");
System.out.println("生成的sql语句为:\n" + sql.toString());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
结果:
生成的sql语句为:
CREATE TABLE USERS (
ID INT,
USERNAME VARCHAR(20) COMMENT '用户名',
PWD VARCHAR(20) COMMENT '密码',
EMAIL VARCHAR(25) COMMENT '邮箱',
)
java注解的实质,何为注解的更多相关文章
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- java深入技术九 (注解)
java注解 (Annotation) 一般起到说明,配置的作用,在java.lang.annotation 定义,本质上没有增强java的能力 1.常用注解:@Override,强制编译器检查标注的 ...
- Java 基础【11】@注解
1.注解简介 JDK 1.5 中引入的 java.lang.annotation 包提供注解编程支持,可以让类在编译.类加载.运行时被读取,并执行相应的处理. 在 Java EE应用的时候,总是免不了 ...
- 深入理解Java:注解(Annotation)--注解处理器
如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解的过程中,很重要的一部分就是创建于使用注解处理器.Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处 ...
- 黑马程序员——【Java高新技术】——JavaBean、注解
---------- android培训.java培训.期待与您交流! ---------- 一.JavaBean * 通过内省引入JavaBean:内省对应的英文全程是IntroSpector.在J ...
- Java从零开始学四十七(注解简述)
一.Java中注解Annotation 什么是注解:用来描述数据的数据(元数据). Java代码里的特殊标记.它为代码中添加用Java程序无法表达的额外信息提供一种形式化的方法,使用我们可以在未来的某 ...
- Java注解教程:自定义注解示例,利用反射进行解析
Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入 ...
- Java注解教程及自定义注解
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
- 【JAVA - 基础】之Annotation注解浅析
注解在JAVA中,尤其是一些ORM框架(如Hibernate等)中是比较常用的一种机制. 注解是JAVA 1.5之后引入的新功能,正确来说是反射的一部分,没有反射,注解也就无法正常使用.注解可以理解成 ...
随机推荐
- Day05 -寻找自己:Ruby的self物件与singleton method
前情提要:在第四天里,我们用参赛者的例子解说实体方法与类别方法.类别中的实体物件,想要玩弄方法时,可以有三种取用方式:(跟斯斯有三种一样) 该类别所定义的实体方法. 模块中可取得的实体方法.(关于模块 ...
- Day03 - Ruby比一比:Module的include与extend
前情提要在第一天里,我们很激昂地用Ruby的类别.物件.方法,写了开赛宣言!在第二天里,我们比较了方法与模块,比的过程中,发现模块多了包含(inclusion)与延伸(extension). 超级比一 ...
- ASP.NET Easyui datagrid增删改+sqlhelper
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjAAAAFxCAYAAABtHZI7AAAgAElEQVR4nOy9DXwU1b3//wmCYHjUPl
- 元组拆包 与 python拆包
一.元组拆包(元组解包.迭代解包) 元组拆包可以应用到任何可迭代对象上(任何迭代对象),被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致.也可以使用用 * 来表示忽略多余的元素. 一般的 ...
- python测试开发django-1.开始hello world!
前言 当你想走上测试开发之路,用python开发出一个web页面的时候,需要找一个支持python语言的web框架.django框架有丰富的文档和学习资料,也是非常成熟的web开发框架,想学pytho ...
- poj3250(单调栈模板题)
题目链接:https://vjudge.net/problem/POJ-3250 题意:求序列中每个点右边第一个>=自身的点的下标. 思路:简单介绍单调栈,主要用来求向左/右第一个小于/大于自身 ...
- sublime安装PackageControl提示失败(被墙了)
An error occurred installing Package Control 然后下面又说visit....某网址 如果弹出这个错误的话,就是被墙了.翻个墙或者改hosts就行了 如果是改 ...
- pwnable.kr-random-witeup
看源代码. 可知,在linux下生成个随机数在于输入数异或等于固定值即可,而且吧, 随机数是固定的. 先得出随机数. random=1804289383 OK,接下来用计算器异或就行啦.0xB526F ...
- Redux 检测状态树变更
一 概述 Redux只是检测引用是否改变. 如果状态树的某个值是对象.数组等,在reducer中需要生成一个新对象.新数组,才能被Redux检测到变更. let fruits = ['apple',' ...
- sql转百分比并保留两位小数
--转百分比并保留两位小数 select ProfitRate =Convert(nvarchar(20), (Convert(decimal(18,2),((DayPrice -MyPrice)*1 ...