35类型与反射

Java的类与Class

  • RTTI(Run-Time Type Identification )运行时类型识另

  • —个Class对象就是一个类的说明书

    • JVM根据这个说明书创建出来一个类的实例
    • 现在你知道静态变量的本质是什么了么?
      • Class对象的属性,归属Class对象
      • 全局变量,类的所有实例共享同一个static变量
  • 复习

  • 将对象按照类型分类

    • instanceof 左边的对象判断它右边的类型一不一样
    • 对象通过getClsss方法拿到Class对象
  • 强制类型转换

    • 每个对象知道自己是从什么对象创建出来的
    • JVM知道对象是什么类型的,一个猫不能转为Integer类型,所以丢一个ClassCastException异常

    java.lang.OutOfMemoryError: PermGen 大概率是类出了问题

Class对象的生命周期

  • 在第一次被使用时被加载
  • 说明书从哪里来
    • .java文件对应的.class文件加载出来的
graph BT
WhiteCat --extends--> Cat --extends--> Animal

根据白猫的说明书捏一个白猫,要先猫的说明书,要猫的说明书首先得有动物的说明书

有动物的说明书把动物造出来,然后用猫的说明书把猫造出来,然后再用白猫的说明书把白猫造出来

类加载的过程

graph LR
加载Loading--> 验证Verification --> 准备Preparation --> 解析Resolution --> 初始化Initialization

Clas s与C lassloader

  • Classloader负责从外部系统中加载一个类
    • 这个类对应的Java文件并不一定需要存在
    • 这个字节码并不一定需要存在
    • 这是Java世界丰富多彩的应用的基石
  • Classloader的双亲委派加载模型
    • Classloader类loadClass方法
    • 任何一个类加载器被要求加载类的时候,它都会问自己的父亲,父亲给它的话就直接返回就不会自己尝试加载
  • Java语言规范与Java虚拟机规范
    • Java Language Specification JLS
    • Java Virtual Machine Specification JVMS
    • 这种分离提供了在JVM上运行其他语言的可能

反射

  • 名字的由来一一为什么叫反射?
    • JVM中一个对象通过镜子看到自己有什么东西,通过动态的方法调用它
  • 假如说,我们想:
  • 根据参数动态创建一个对象?
  • 根据参数动态调用一个方法?
  • 根据参数动态获取一个属性?
  • Class
    • Class.forNameO
    • Class.newInstance jdk9之后废弃
    • Class.getConstructor.newInstance
  • Method
    • Method.invoke
  • Field
    • Field.get

反射无处不在

  • Spring源码分析

要对Object所有的方法都很熟悉

练习

使用反射实现一个Java Bean到Map的转换器

实现一个自定义的ClassLoader

「资料来源:饥人谷」

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注