Java Annotation 刷课笔记(一)
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 刷课笔记(一)的更多相关文章
- Java Annotation 刷课笔记(二)
1.反射机制性能问题(安全检查) 1.1setAccessible 启用和禁用访问安全检查的开关,值为true,则指示反射的对象在使用时应该取消Java语言访问检查,值为false,则指示反射的对象应 ...
- Udacity调试课笔记之断言异常
Udacity调试课笔记之断言异常 这一单元的内容不是很多,如Zeller教授所说,就是如何写.检查断言,并如何使用工具实现自动推导出断言的条件. 现在,多数的编程语言,尤其是高级编程语言都会有内置的 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Java自动化环境搭建笔记(2)
Java自动化环境搭建笔记(2) 自动化测试 在笔记一中已经完成了一键构建项目.xml指定规划测试集.数据解耦与allure报告生成的开发.接下来便是: 浏览器驱动通过配置启动 页面元素定位解耦,通过 ...
- Java自动化环境搭建笔记(1)
Java自动化环境搭建笔记(1) 自动化测试 先搭建java接口测试的环境: 使用mvn命令构建项目 测试集通过testNG.xml组织并运行 测试数据解耦,通过Excel等文件提供 基础依赖 创建m ...
- 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
<Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...
- Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介)
原文:Elasticsearch7.X 入门学习第四课笔记---- Search API之(Request Body Search 和DSL简介) 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- Java二次复习笔记(1)
Java二次复习笔记(1) Java采用的默认字符编码集是Unicode. byte=byte+byte报错,值为int,而byte+=byte不报错.同样short = short+short报错, ...
随机推荐
- 在JS中统计函数执行次数
一.统计函数执行次数 常规的方法可以使用 console.log 输出来肉眼计算有多少个输出 不过在Chrome中内置了一个 console.count 方法,可以统计一个字符串输出的次数.我们可以利 ...
- 搜索引擎算法研究专题六:HITS算法
搜索引擎算法研究专题六:HITS算法 2017年12月19日 ⁄ 搜索技术 ⁄ 共 1240字 ⁄ 字号 小 中 大 ⁄ 评论关闭 HITS(Hyperlink-Induced Topic Sea ...
- Cordova-在现有iOS工程自动化接入Cordova插件
模拟Cordova插件命令 自己编写脚本,了解cordova添加插件做了哪些事情. 上一篇文章了解到,web与native的交互主要是cordova.js中的exec方法调用,触发交互事件.UIWeb ...
- ffmpeg精简编译
项目上需要用到ffmpeg的接收功能,把rtp流转封装为ts吐udp组播流,不涉及编码,所以需要精简一下脚本如下: #!/bin/bash dir=$(pwd) echo $dir rm -rf $d ...
- ubuntu 18.04更换源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak //备份 sudo vim /etc/apt/sources.list //修改 ##阿 ...
- RCU原理分析
简介 RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用.RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制 ...
- 博客侧边栏公告html代码
前一小段是时钟: 后一段是百度统计,但是显示不出来. 网站概况 - 百度统计 https://tongji.baidu.com/web/25880379/overview/index 趋势分析 - 百 ...
- Vue知识整理9:class与style绑定
1.v-bind:class:绑定class样式.通过控制isActive变量值来实现是否显示:通过.active样式设置背景颜色. 2.支持普通的class与v-bind绑定样式混合使用: v-bi ...
- Redis存储对象序列化和反序列化
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInpu ...
- IDEA给类和方法配置注释模板(参数换行显示)
创建类模板 1.打开设置:File–>settings–>Editor–>File and Code Templates–>Includes 2.输入注释模板 #if (${P ...