java 注解与反射
学习笔记:
1.注解:注释给计算机理解
英文:Annotation
2.注解不是必须的,但是会因为程序的需要
3. 三种java内置类型:Override、Deprecated、Supresswarnings(不在编译器上显示警告信息,需要提供参数),
4. 元注解(meta_annotation) :
@Target 便是我们注解的使用位置,METHOD、CLASS
@Retention 在什么级别保存注释信息,描述注解的生命周期 runtime>class>sources
@Documented 将注解生成在JAVAdoc中
@Inherited 子类可以继承父类
5.自定义注解
使用@interface定义方法名
注解的蚕食若无默认值,注解时则需显式赋值
一个参数时用value(),注解时则不用 value=,直接赋值
6 java 通过反射变成动态语言
7.查看是否是同一个对象,对比hashcodde
8 Class 类,不同与关键字class,Class本身是一个java类,描述的是其他类的类型信息
Class对象只能由系统建立;通过Class可以得到一个类中所有被加载的结构;Class类是Reflection的根源;
Person p = new Person();
Class c1 = new Person();
对比就可看出Class如同Person一样是一个java类!
扫盲:很多类型都可以有Class对象
9.类初始化,jvm启动,先初始化main()所在类,初始化子类时父类没被加载会先去搞父类
不初始化,子类调用父类常量不会初始化子类、父类,常量已经在常量池中了,
Son son[] = new Son();不会初始化Son,即数组定义类引用
10:类的加载过程 :
类的加载Load:字节码load到内存,将静态数据调入方法区,生成java.lang.Class对象
链接Link:
验证:符合jvm规范
准备:类变量分配方法区内存,设置默认值
解析:常量池的符号引用(常量名)替换为直接引用(地址)
初始化:Initialize:
执行类构造器<clinit>():类变量赋值,静态代码块合并;
初始化子父类;
jvm保证clinit()方法多线程安全
11.反射获取类,对象,方法,字段
newInstance()时类中必须有无参构造,否则通过构造器方法创建对象getDeclaredConstructor(),未写参数类型则返回所有构造器
反射获取方法后,invoke()调用方法,同时需要传递所需参数;
若Method,Constructor,Field 为private则需setAccessble(true)
12.注解可以获取泛型信息
13 ORM: object relationship mapping 对象关系映射
利用反射获取注解,注解上加入数据库相应信息甚至sql语句,再利用反射获取注解进行操作,完成类与表结构的映射
14.注意,反射是创建的是运行时类的对象工具,即反射获取运行时类的完整结构,