1.什么是注解?

1.1.Annotation是从JDK5.0引入的新技术

1.2.Annotation的作用:

  • 不是程序本身,可以对程序作出解释(这一点,和注释没什么区别)
  • 可以被其他程序(比如编译器)读取,注解信息处理流程,是注解和注解的重大区别,如果没有注解信息的处理流程,则注解毫无意义

1.3.内置注解

@Override 重载

@Deprecated  不建议使用

@SupressWarning  去除警告信息

2.自定义注解

2.1.自定义注解的前提是注解上要加入两个元注解

2.1.1.Target 注解目标是谁

  package   包

  type          类,接口,枚举,Annotation

  constructor 构造器

  field    描述域

  method    描述方法

  local_variable   局部变量

2.1.2 Retention 需要在什么级别保存注解信息,用于描述注释的声明周期(是CLASS,SOURCE还是RUNTIME)

  source  在源文件中保留

  class   在class文件中保留

  runtime  在运行时可以被反射读取(这个用的比较多)

2.1.3 可以写类似方法的参数

String stu() default "";

3.利用反射机制读取注解信息

示例:使用反射写一个程序来创建tb_student表

studnet类

package littlepage.annotation.demo01;

@AnnoTable("tb_student")
public class Student {
@AnnoField(columnName = "id",type = "int",length = )
private int id;
@AnnoField(columnName = "name",type = "varchar",length = )
private String name;
@AnnoField(columnName = "field",type = "varchar",length = )
private int age;
}

AnnoTable Annotation

package littlepage.annotation.demo01;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AnnoTable {
String value();
}

AnnoField Annotation

package littlepage.annotation.demo01;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoField {
String columnName();
String type();
int length();
}

转换类

package littlepage.annotation.demo01;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field; public class Demo01 {
public static void toSQL(Class<?> clazz) {
//拿到类名上的属性值
AnnoTable table = (AnnoTable) clazz.getAnnotation(AnnoTable.class);
String tableName = table.value();
//拼SQL
StringBuilder sb = new StringBuilder();
sb.append("create table ").append(tableName).append("(\n");
//拿到各个Field
Field[] fields = clazz.getDeclaredFields();
String fieldString;
for (Field field : fields) {
Annotation[] annotations=field.getAnnotations();
for (Annotation annotation:annotations) {
String annotationString=annotation.toString();
String columnName=annotationString.substring(annotationString.indexOf("columnName=")+,annotationString.indexOf(", type"));
String typeName=annotationString.substring(annotationString.indexOf("type=")+,annotationString.indexOf(", length"));
String length=annotationString.substring(annotationString.indexOf("length=")+,annotationString.indexOf(")"));
sb.append(columnName+" "+typeName+"("+length+"),\n");
}
}
sb.replace(sb.length()-,sb.length(),"\n);");
System.out.println(sb);
} public static void main(String[] args) {
toSQL(Student.class);
}
}

Java Annotation 刷课笔记(一)的更多相关文章

  1. Java Annotation 刷课笔记(二)

    1.反射机制性能问题(安全检查) 1.1setAccessible 启用和禁用访问安全检查的开关,值为true,则指示反射的对象在使用时应该取消Java语言访问检查,值为false,则指示反射的对象应 ...

  2. Udacity调试课笔记之断言异常

    Udacity调试课笔记之断言异常 这一单元的内容不是很多,如Zeller教授所说,就是如何写.检查断言,并如何使用工具实现自动推导出断言的条件. 现在,多数的编程语言,尤其是高级编程语言都会有内置的 ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  5. Java自动化环境搭建笔记(2)

    Java自动化环境搭建笔记(2) 自动化测试 在笔记一中已经完成了一键构建项目.xml指定规划测试集.数据解耦与allure报告生成的开发.接下来便是: 浏览器驱动通过配置启动 页面元素定位解耦,通过 ...

  6. Java自动化环境搭建笔记(1)

    Java自动化环境搭建笔记(1) 自动化测试 先搭建java接口测试的环境: 使用mvn命令构建项目 测试集通过testNG.xml组织并运行 测试数据解耦,通过Excel等文件提供 基础依赖 创建m ...

  7. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记

    <Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...

  8. Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)

    原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...

  9. Java二次复习笔记(1)

    Java二次复习笔记(1) Java采用的默认字符编码集是Unicode. byte=byte+byte报错,值为int,而byte+=byte不报错.同样short = short+short报错, ...

随机推荐

  1. 初识java虚拟机——JVM

    1.Java程序运行过程 编写 编译 运行 过程如图所示: 2.JVM的认识 定义:JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚 ...

  2. LibUsbDotNet使用方法

    最近在用C#调试USB程序,libusb源码是C语言的,C#用起来不方便,偶然在网上看到了LibUsbDotNet,这是开源的项目,下载后参考Example,用起来非常方便. LibUsbDotNet ...

  3. python学习之文件读写操作

    open函数 在使用文件之前,需要先打开,即使用open函数 如: files=open("文件路径","操作方式") 解释如下: (1.files:为文件对象 ...

  4. flutter dialog异常Another exception was thrown: Navigator operation requested with a context that does not include a Navigator

    我在使用flutter里的对话框控件的时候遇到了一个奇怪的错误 Another exception was thrown: Navigator operation requested with a c ...

  5. ReportManager

    package com.neusoft.report.engine; import com.neusoft.report.common.Logger; import com.neusoft.repor ...

  6. Linux 命令 - man 查看命令的文档

    man 命令是 Linux 中最常用的命令,碰到任何让你疑惑的命令,都可以 man 一下来查看详情.不只是 shell 命令,C 语言库函数和系统调用等内容也可以通过 man 命令查看. man 命令 ...

  7. 【HANA系列】SAP HANA ODBC error due to mismatch of version

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA ODBC er ...

  8. Git 创建分支并合并主分支

    首先,我们创建dev分支,然后切换到dev分支: $ git checkout -b dev(等价于 $ git branch dev $ git checkout dev ) Switched to ...

  9. 从零构建vue项目(一)--搭建node环境,拉取项目模板

    本文是基于vuecli2搭建的项目. 1. 下载安装nodejs     地址:https://nodejs.org/en/download/ 选择安装版windows .msi, 不要选择压缩版 下 ...

  10. 第九周总结&第七次实验报告

    实验7 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 实验过程 ...