Hibernate——注解结合反射来构建SQL语句的简单的处理器模型
基础知识:实际上Java注解与普通修饰符(public、static、void等)的使用方式并没有多大区别
【1】@Test内部没有定义其他元素,所以@Test也称为标记注解(marker annotation),但在自定义注解中,一般都会包含一些元素以表示某些值,方便处理器使用
【2】利用运行时注解来组装数据库SQL的构建语句的过程
【3】Java8后,新增的TYPE_PARAMETER可以用于标注类型参数,而TYPE_USE则可以用于标注任意类型(不包括class)。
【4】声明注解元素时可以使用基本类型但不允许使用任何包装类型,同时还应该注意到注解也可以作为元素的类型,也就是嵌套注解
【5】对于非基本类型的元素,无论是在源代码中声明,还是在注解接口中定义默认值,都不能以null作为值
【6】注解是不支持继承的,因此不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口
【7】所谓的快捷方式就是注解中定义了名为value的元素,并且在使用该注解时,如果该元素是唯一需要赋值的一个元素,那么此时无需使用key=value的语法,而只需在括号内给出value元素所需的值即可:ex:@IntegerVaule(20)
【8】其他内置注解源码:
deprecation:使用了不赞成使用的类或方法时的警告;
unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型;
fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
path:在类路径、源文件路径等中有不存在的路径时的警告;
serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;
finally:任何 finally 子句不能正常完成时的警告;
all:关于以上所有情况的警告。【9】@Documented 被修饰的注解会生成到javadoc中:javadoc DocumentDemo.java DocumentA.java DocumentB.java
【10】@Inherited 可以让注解被继承,但这并不是真的继承,只是通过使用@Inherited,可以让子类Class对象使用getAnnotations()获取父类被@Inherited修饰的注解
【4】应用:数据库表与Bean类的映射
注射与反射结合:
Java使用Annotation接口代表注解元素,该接口是所有Annotation类型的父接口。同时为了运行时能准确获取到注解的相关信息,Java在java.lang.reflect 反射包下新增了AnnotatedElement接口,它主要用于表示目前正在 VM 中运行的程序中已使用注解的元素,通过该接口提供的方法可以利用反射技术地读取注解的信息,如反射包的Constructor类、Field类、Method类、Package类和Class类都实现了AnnotatedElement接口。
————————————————API接口包括:
==================================================================
【1】@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
【2】@Retention(value={SOURCE,CLASS,RUNTIME})
【3】注解支持地数据类型:
所有基本类型(int,float,boolean,byte,double,char,long,short)
String
Class
enum
Annotation
上述类型的数组
ex:
//枚举类型
enum Status {FIXED,NORMAL};//声明枚举
Status status() default Status.FIXED;//布尔类型
boolean showSupport() default false;//String类型
String name()default "";//class类型
Class<?> testCase() default Void.class;//注解嵌套
Reference reference() default @Reference(next=true);//数组类型
long[] value();
运行时注解来组装数据库SQL的构建语句:实例
Hive:是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表
Java 8中注解增强
【1】@Repeatable是JDK1.8新加入的,它表示在同一个位置重复相同的注解
ex:
@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited //添加可继承元注解
@Repeatable(FilterPaths.class)
public @interface FilterPath {
String value();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited //添加可继承元注解
@interface FilterPaths {
FilterPath[] value();
}@FilterPath("/web/list")
@FilterPath("/web/getList")
class CC { }//AA上不使用@FilterPath注解,getAnnotationsByType将会从父类查询
class AA extends CC{}
【2】@FilterPath和@FilterPath时必须指明@Inherited,
原文链接:https://blog.csdn.net/javazejian/article/details/71860633