java自学之路-day21

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java自学之路-day21相关的知识,希望对你有一定的参考价值。

JAVA21

类加载器

类的加载

l  当程序要使用某个类时,如果还没被加载到内存中,系统会就会通过加载 连接 初始化三个步骤对这个类进行初始化

l  加载

  1. 类的加载器将class文件读入内存,放入方法区,并为之创建一个Class对象
  2. 是编译后的class文件的一个对象
  3. 对象进入堆内存
  4. 又叫字节码对象
  5. 可以使用不可以创建

l  连接

  1. 验证 是否有正确的内部结构
  2. 为静态成员分配空间 并设置默认初始化值
  3. 解析 将类的二进制数据中的符号引用变为直接引用 比如a=1 在内存中直接为1没有了符号a

l  初始化

就是创建对象

类的加载时机

l  新建一个有main方法的类

l  其他类调用这个类中的方法 成员变量 或者实例化创建对象

l  其他类调用这个类的子类中的方法 成员变量 或者实例化对象

l  运行任何一个类都是先运行Object类的方法

=

类的加载器的组成

l  根类加载器

  1. 负责核心类库的加载
  2. Jre目录中的rt.jar
  3. 项目中的 JRESystemLibrary 中的rt.jar

 

l  扩展加载器

  1. 加载扩展的类
  2. Jre中的ext文件夹
  3. 项目中的 JRESystemLibrary 中的ext文件夹中的jar包

l  系统加载器

  1. 负责加载自己写的类
  2. 负责加载第三方工具类

 

反射

概念

l  运行时期对于任何一个类

l  都能知道这个类的所有属性和方法

l  对于任何一个对象都能调用他的任何一个方法和属性

l  这种动态获取信息及动态调用对象的方法的功能就叫做java语言的反射机制

功能

  1. 已经完成的一个类如果要增加功能在不改源码的前提下怎么添加
  2. 将新功能类的字节码文件也就是编译后的class文件解剖
  3. 在源类中调用即可

 

 

Class文件的产生过程

l  类加载器加载新功能类 产生一个class文件对象

 

l  用这个文件对象调用新功能类的方法

 

l  Java.lang.Class类描述文件对象的类 文件对象就是这个类的类型

 

获取class文件对象的三种方式

l  对象获取

 

l  类名获取

 

 

l  Class类的静态方法获取

 

l  三个方法获得的对象都是同一个

反射获取class文件中的构造方法

l  运行构造方法相当于创建了对象

l  getConstructors()获取class文件对象中的所有公共的构造方法

l  返回Constructors类型的数组

 

l  获取一个指定构造方法

 

可变参数

l  运行

NewInstance()

 

 

 

l  获取有参数的构造方法并运行

 

 

l  快速方式

  1. 被反射的类必须具有空参构造方法
  2. 构造方法必须是公共的

 

反射获取私有构造方法

l  不推荐破坏了程序的封装性安全性

l  getDeclaredConstructors()

l  获取所有的构造方法

l  返回一个Constructor类型的数组

l  示例

 

l  getDeclaredConstructor(class..c)

l  可变参数

l  返回一个私有的构造方法

l  示例

 

不能访问私有的

l  setAccessibale 对权限的访问

 

 

反射获取成员变量

l  Class类中的方法 getFields() getDeclaredFields()则是获取私有的

  1. 获取所有公共的所有公共类的成员变量
  2. 返回值Field[]数组

 

l  获取指定成员变量

 

反射获取空参数成员方法

l  getMethods()

  1. 获取Class文件中的所有公共成员方法包括继承的
  2. Method类是描述成员方法的对象

 

 

方法很多都是公共的

l  getMethod()

  1. 方法参数 方法名和可变参数
  2. 返回一个method对象

 

l  使用获得的方法

Invoke()

  1. 运行method获得的方法
  2. 参数是一个类文件的对象

 

反射获取有参数的成员方法

 

反射泛型擦除

l  存储规定泛型之外的元素

l  伪泛型 编译后的class文件没有泛型可以直接获取class文件对象获取方法

 

l  不能使用曾强for或者迭代器遍历 所以只是为了练习反射

通过配置文件

l  原理

 

l  实现

 

以上是关于java自学之路-day21的主要内容,如果未能解决你的问题,请参考以下文章

java自学之路-day10

java自学之路-day06

java自学之路-day11

java自学之路-day19

java自学之路-day14

java自学之路-day16