
本文共 1481 字,大约阅读时间需要 4 分钟。
注解
1、注解是什么?
2、内置注解
3、元注解
负责注解其他注解


runtime > class > source
4、自定义注解

——————————————————————————
反射
5. 动态语言和静态语言
6、反射的含义
7、class类
8、class类的常用方法
9、创建类的方式有哪些
10、哪些类型可以有class对象

只要元素类型与维度一样,那就是同一个class。
11、java内存分析
方法区是特殊的堆,存放一些类和static变量。
12、类的加载过程

1、(加载)将字节码加载到内存,将静态数据转换成方法区的运行时数据结构,并在堆中产生一个类对应的class对象;(方法区中的类,在堆上建立一个引用。)
2、(验证+准备+解析)验证完符合JVM规范后,给类变量在方法区上分配内存,并设置默认初始值0(这里只是给了个默认初始值,实际初始值在初始化的时候才给赋值);解析过程将常量池中的符号引用替换为直接引用(地址)。
3、初始化,开始执行代码(栈中的main方法),将代码块合并(此时static变量的初始值假如在之后再次进行赋值,那么之前的值将会被覆盖)
13、类的初始化
类的主动引用(有且只有6种情况):
1、虚拟机启动,先初始化main方法所在的类;(虚拟机启动——>针对于main方法所在的类) 2、new一个类的对象;(new一个对象) 3、调用类的静态成员(除了final修饰的)和静态方法;(静态变量) 4、使用java.lang.reflect包的方法对类进行反射调用;(反射调用) Class.forName 5、当初始化一个类,如果其父类没有被初始化,则会先初始化其父类。(子类初始化)类的被动引用(不会发生类的初始化)
1、当访问某静态域时,只有真正声明该域的类才会被初始化。(子类引用父类的静态变量不会导致子类初始化) 2、通过数组定义类引用,不会触发此类的初始化; 3、引用常量不会触发此类的初始化**(常量在链接阶段就已经存入常量池了)**14、类加载器
作用: 将class文件字节码加载到内存之后,会对静态数据转换为方法区的运行时数据结构,并在堆上生成代表该类的java.lang.Class对象,作为方法区中类数据的访问入口。(加载字节码——>在方法区建立运行时数据结构——>在堆上生成该类的引用)。
类缓存: 某个类被加载到类加载器后,将维持一段时间,JVM垃圾回收机制才会回收这些class对象。
类加载器的类型:引导类加载器、扩展类加载器、系统类加载器。

15、获取类的运行时结构
通过反射获取运行时类的完整结构
1、实现的全部接口; 2、所继承的父类; 3、全部的构造器; 4、全部的方法; 5、全部的域(属性); 6、注解双亲委派机制,的确是防止同名包、类与 jdk 中的相冲突,实际上加载类的时候,先通知 appLoader,看 appLoader 是否已经缓存,没有的话,appLoader 又委派给他的父类加载器(extLoader)询问,看他是不是能已经缓存加载,没有的话,extLoader 又委派他的父类加载器(bootstrapLoader)询问,BootstrapLoader看是不是自己已缓存或者能加载的,有就加载,没有再返回 extLoader,extLoader 能加载就加载,不能的话再返回给 appLoader 加载,再返回的路中,谁能加载,加载的同时也加缓存里。正是由于不停的找自己父级,所以才有 Parents 加载机制,翻译过来叫 双亲委派机制。
发表评论
最新留言
关于作者
