好友
阅读权限10
听众
最后登录1970-1-1
|
ReviewDay4
反射
反射机制
反射相关类
Class 类
- 1.Class类也是类,也继承了Object类
- 2.Class类对象由系统创建(不是new出来的)
- 3.同一个类的Class类对象,在内存中只有一份,因为类只加载一次
- 4.每个类的实例都知道自己由哪个Class实例生成的
- 5.通过Class对象可以得到一个类的完整结构
- 6.Class对象存放于堆中
- 7.类的字节码二进制数据存放于方法区(包括方法名,变量名, 方法代码,访问权限)
获取Class类对象
-
已知一个类的全类名,且该类在类路径下,可以通过Class类的静态方法forName()获取
eg : Class cls1 = Class.forName("java.lang.Cat");
>
> 应用 : 多用于配置文件,读取类全路径,加载类
-
已知具体类,通过类的class方法获取(最安全可靠,性能最高)
eg : Class cls2 = Cat.class;
>
> 应用 : 多用于参数传递,比如通过反射达到对应构造器对象
-
已知某个类的实例,通过该实力的getClass方法获取Class对象
eg : Class cls3 = cat.getClass(); //运行类型
>
> 应用 : 通过创建好的对象获取Class对象
-
其他方式
ClassLoader cl = 对象.getClass().getClassLoader();
>
> Class cls4 = cl.loadClass("类的全类名");
-
基本数据
Class cls = 基本数据类型.class
-
包装类,可以通过.TYPE得到Class类对象
Class cls = 包装类.TYPE
类加载
1.加载方式
- 静态加载: 编译时加载相关的类(依赖性强)
- 动态加载: 运行时再加载需要的类(降低依赖性)
2.类加载时机
- 创建对象时(new) //静态加载
- 当子类被加载时,父类也会加载 //静态加载
- 调用类的静态成员时 //静态加载
- 反射 //动态加载
3.类加载过程
-
过程图
-
各阶段任务
- 加载阶段:JVM将字节码从不同数据源转化为二进制字节流加载到内存中,并生成Class类对象
- 连接阶段:验证
验证Class文件的字节流信息是否符合虚拟机要求 ->准备对静态变量分配内存并默认初始化(默认初始值,如0,0L,null, false ->解析将常量池中的符号引用替换为直接引用
- 初始化节点:执行类中定义的Java程序代码(静态变量赋值和静态代码块)
|
-
-
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|