注解Annotation
元注解————————java主要有四个meta-Annotation:@Target @Retetion @Document @Inherited
- @Target:注解的生效范围------可以放在什么位置
- @Retetion:注解生效的等级--------source class runtime
- @Document:表示注解是否生成在javadoc中
- @Inherited :表示子类可以继承父类的注解
注解创建:
@interface 自动继承Annotation
格式为 @interface 注解名称{
注解的参数
}
注解的参数: 参数类型+参数名+()
还可以在注解参数后加默认值 default 默认值
反射Reflection
1.获取反射对象
1.Class clazz = Class.forName("包名.类名")
说明:一个类在内存中只有一个Class对象,一个类被加载后,整个内部结构都会被封在class对象中
2.Object中有getClass()方法
class c1 = 对象名.getclass();
3.具体类可以直接.class
Class clazz =类名.class
2.java内存分析
类的初始化:
类的加载:加载到内存中,创建为一个Class文件,将文件的静态数据(静态变量,静态方法,代码,常量池)转换到方法区的运行时的数据结构,然后在堆中生成一个Class对象;
类的链接:将二进制代码合并到jvm运行状态中的过程 ---------验证 、 准备(正式为static变量何止默认值) 、 解析;
类的初始化:将所有静态方法以及静态赋值动作合并成类构造器<clinit>,初始化时如果父类没有初始化就先初始化父类;
问题:什么时候会进行类的初始化
主动引用的时候会发生,被动引用不会发生
- 虚拟机运行时,main方法所在的类会被初始化
- new一个类的对象会进行初始化
- 调用类的静态变量或者方法的时候会被初始化
- 使用java.lang.reflect下的方法对类进行反射调用的时候
- 子类初始化时,发现父类未初始化,会进行父类的初始化