摘要:本篇blog讲解java注解和反射
注解
注释:给人看的
注释:给程序看的
一、什么是注解
从JDK5.0引入
可以被其他程序读取(如编译器)
1 | //什么是注解 |
注解是以“@注释名”在代码中存在的,还可以添加一些参数值
可以附加在包、类、方法、field(字段)等上面,相当于给他们添加了额外的辅助信息(例如起到检查的作用)
我们可以通过反射机制编程实现对这些元数值的访问
二、常见注解种类
2.1 内置注解
@Override:用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明
@Deprecated:用于修辞方法,属性,类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择
@SuppressWarnings:用来抑制编译时的警告信息(镇压警告),需要参数
- @SuppressWarnings(“all”)
- @SuppressWarnings(“unchecked”)
- @SuppressWarnings(value={“unchecked”,“deprecation”})
- etc…
1 | //@Override重写注解 |
2.2 元注解
元注解的作用
元注解的作用就是负责注解其他注解
- @Target:表示注解的作用对象
- @Retention:表示注解的作用时间范围:源码→字节码→运行时(如果运行时还可以作用,那源码和字节码的时候当然也可以。即高级兼容低级)
- @Document:表示是否会生成文档
- @Inherited:说明子类可以继承父类的注解
1 | //表示注解的作用时间范围:源码→字节码→运行时 |
2.3 自定义注解
(1).使用@interface关键字定义注解,注意关键字的位置使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。
(2).成员以无参数无异常的方式声明,注意区别一般类成员变量的声明其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称
(3).可以使用default为成员指定一个默认值
(4).成员类型是受限的,合法的类型包括原始类型以及String、Class、Annotation、Enumeration (JAVA的基本数据类型有8种:byte(字节)、short(短整型)、int(整数型)、long(长整型)、float(单精度浮点数类型)、double(双精度浮点数类型)、char(字符类型)、boolean(布尔类型)
(5).注解类可以没有成员,没有成员的注解称为标识注解,例如JDK注解中的@Override、@Deprecation
(6).如果注解只有一个成员,并且把成员取名为value(),则在使用时可以忽略成员名和赋值号“=” ,例如JDK注解的@SuppviseWarnings ;如果成员名不为value,则使用时需指明成员名和赋值号”=”,
(7).注解元素要有值,定义注解元素时,经常使用空字符串、0等作为默认值
1 | public class DIYAnno { |
注:
- 注解参数传递没有顺序,都得指明参数名
反射
一、什么是反射
更加灵活,更加不安全
甚至私有对象!!
为什么叫反射,因为不是直接从这个类本身得到信息的,而是从它的反射对象class上得到的,它的反射对象就像一面镜子。反射出了这个类的内部信息
反射低效率,通常情况下,new出来比反射出类对象快许多
实体类:包含属性、有参无参构造方法,setter&getter方法的类,通常用于数据处理
通常可以用hashcode判断对象是否是同一个
final修饰方法:final定义的方法不能被重写。
每个类都有一个Class类型的对象
获取反射对象时,泛型可以不要
每个类的实例都记得自己是哪个Class实例生成的
Class是类,class是关键字
由一个对象,就能知道类,如果知道更多信息,就更快
只要类型一样,反射出来的类结果就一样。如两个长度不同的一维数组,反射的结果的hashcode却相同
在初始化过程中会收集静态代码块和类变量的赋值操作
new出来一个对象,对象保留指向其类的class对象的指针,从而根据反射获得这个类的其他东西
p9是有问题的:
1、不是直接加载,而是等用到的时候再加载。
2、创建类的实例的时候,类的三阶段(装载、链接、初始化)都已经完成
包含public static void main的类才能被一开始就加载
c++、c写的肯定读不到
双亲委派机制:保证安全(如果自己定义一个类,和上级加载器冲突了,java会优先调用他自己的,而不是你写的)
class forName有什么意义呢?
获得属性的值?
getDeclared可以获得私有属性,否则无法获得?
通过setAccessible关闭检测,使得私有属性可以更改,
如果不关闭,不能直接操作,但可以访问?
不强转没法获得指定注解的值?