Java 注解和反射
一 . 注解(Annotation)
1 . 定义
不是程序本身,不是必要的,可以对程序做出解释
可以被其他程序 读取
2 . 格式:以 @ 开头,后面跟注解名,还有可以加参数值
3 . 内置注解:
1. @Override:表示重写父类的方法
2 . @Deprecated:表示不推荐使用的
3 . @SuppressWarnings:用于抑制编译时的警告信息
4 . 元注解(meta-annotation)
负责解释注解的 注解
1 . @Target:用于描述注解的 使用范围,用 value 赋值
2 . @Retention:用于描注解的 生命周期,用 value 赋值
默认是 RUNTIME
SOURCE < CLASS < RUNTIME
编译的时候 < 类中 < 运行的时候
3 . @Documented:表示注解是否生成在 Javadoc中
4 . @Inherited:表示子类是否继承父类的注解
5 . 自定义注解:@interface
格式:public @interface 注解名 { 定义内容 }
二 . 反射机制(Reflection)
1 . 了解动态语言:运行时,代码可以根据条件改变自身的结构(JavaScript,PHP,Python)
2 . 了解静态语言:运行时,结构不可改变(Java,C,C++)
但是Java 可以通过 反射机制,获得类似于动态语言的特性
3 . 反射机制允许程序执行时,通过Reflection API 获取任何类的内部信息,
并可以直接操作任意对象内部的属性和方法
(可以取到 private 修饰的属性方法)
4 . 加载完类后,堆内存的方法区就产生了一个Class类型的对象(一个类只有一个Class对象),
这个对象包含了完整的类的结构信息,
这个对象就像 一面镜子,我们可以通过 这个对象 来 看到 类的结构,
所以形象的称之为 反射
5 . 优缺点:
优点:可实现动态创建对象和编译,灵活性强
缺点:对性能有影响
6 . 通过反射获取对象
hashcode一样说明 类在被加载完后,每个类只会有一个 Java对象
7 . Class类的常用方法
8 . 获取class类的实例
三 . Java 内存分析
1 .
堆:存放 new的对象和数组,可被共享,不会存放别的对象引用
栈:存放 基本变量类型(包含其具体数值)和引用对象的变量
会存放这个引用在堆里的具体地址
方法区(特殊的堆):包含所有的 class类和 static 变量
四 . 通过反射操作泛型
1 . 泛型
我的理解:把类型 像变量一样传给 类或方法,类或者方法里究能使用这个变化的类型了
可以把泛型理解为 一个变量,需要我们去赋值
五 . 反射操作注解
代码: 自定义注解
操作类:
测试: