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. linux交叉编译Windows版本的ffmpeg

    主要参考http://www.cnblogs.com/haibindev/archive/2011/12/01/2270126.html 在我的机器上编译libfaac的时候 出现问题了 输出如下 . ...

  2. docker镜像和加速

    首先,需要明确一个问题:Mirror 与 Private Registry 有什么区别? Private Registry 是开发者或者企业自建的镜像存储库,通常用来保存企业内部的 Docker 镜像 ...

  3. cannot assign to struct field xxx in map

    golang 中对 map 类型中的 struct 赋值报错 type s struct{ name string age int}func main(){ a := map[string]s{ &q ...

  4. 【算法与数据结构】图的最小生成树 MST - Prim 算法

    Prim 算法属于贪心算法. #include <stdio.h> #define VERTEXNUM 7 #define INF 10000 typedef struct Graph { ...

  5. 干货 | 剑指offer系列文章汇总

    下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现  剑指offer系列  始 剑指offer—灯管问题(1)  剑指offer—10人电梯(2)  ...

  6. java 多线程并发问题总结

    java 多线程并发主要通过关键字synchronized实现 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问 ...

  7. java 中的equals()小结

    转载自http://www.cnblogs.com/jackyrong/archive/2006/08/20/481994.html Java中的equals是十分重要的,和= =要区别开来,最近在看 ...

  8. [Git] 014 远程仓库篇 第一话

    0. 前言 在 [Git] 001 初识 Git 与 GitHub 之新建仓库 中,我在 GitHub 上建了一个仓库 "interesting" 这回的任务 把远程的 " ...

  9. 如何学习MySQL数据库管理员(OCP)认证(转)

    如何学习MySQL数据库管理员(OCP)认证 转自:   甲骨文专家中,MySQL 5.6数据库管理员( OCP )证明您的安装和优化MySQL服务器,设置复制和安全,执行数据库备份及性能优化和保护M ...

  10. 获取kafka最新offset-scala

    无论是在spark streaming消费kafka,或是监控kafka的数据时,我们经常会需要知道offset最新情况 kafka数据的topic基于分区,并且通过每个partition的主分区可以 ...