小王Java学习打卡day16——反射

反射

类的加载机制

  1. jvm 和 类

    • 运行带有java主方法的类(main)
    • 启动jvm去加载字节码
    • 程序何时结束:
      • 程序正常结束
      • 出现异常,没有捕获异常
      • System.exit()方法
      • 强制杀进程
    • **重点:**jvm进程结束,进程中的所有内存数据丢失。
  2. 加载机制

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7CCRHd2-1653839171053)(http://i1.go2yd.com/image.php?url=0MA6WvUbsE)]

  3. 初始化操作:

    • 加载类:class文件(字节码文件)载入内存里面,创建一个字节码对象,类加载使用类加载器(ClassLoader,由jvm提供)
    • 连接:字节码加载进内存后,jvm会生成一个class对象,把类中的二进制数据提供给jre
      • 验证:验证加载的内是否有正确的结构
      • 准备:类里面有常量,需要分配内存地址,并且提供默认值
      • 解析:类里面的二进制数据的符号的引用替换成直接引用
        • 符号引用:Class文件中(CONSTANCE_CLASS_INFO, )
        • 直接引用:直接指向目标指针,相对偏移量
    • 初始化:jvm负责对类进行初始化,static
      • 如果类没有被加载,则优先加载,并建立连接
      • 直接父类没有加载,先加载父类
      • 静态代码块优先执行,

反射概述

  1. 问题:Object obj = new String(“abc”);

    • 需求:调用String中的length()方法
      • 使用强制类型转换
      • 不知道真实类型如何解决?
  2. 问题:一切皆对象(类属于什么对象?方法属于什么对象?字段属于什么对象?)

    • Class 表示所有类
    • Method 表示所有的方法
    • Filed 表示所有的字段
    • Constructor 表示所有的构造器

    Class类和Class实例

    1. Class表示所有的类

    2. Class实例:一份份的字节码(类,接口,枚举,注解)

    3. 各种类型如何表示?

      • String: Class<java.lang.String>
      • HashMap: Class<java.util.HashMap>
    4. 如何获取一个字节码Class对象?

      • //直接使用class类
        Class<String> Class1 = String.class;
        //对象形式
         Object obj = new String("abc");
        Class<?> Class2 = obj.getClass();
        //知道类的全限定类名 java.lang.String
        Class<?> Class3 = Class.forName("java.lang.String");
        
        • 重点:同一个jvm中,只存在一个类的一份字节码问价你和一份字节码对象

        • 使用最多的就是Class.forName(“类的全限定名”);

        • 基本数据类型的字节码如何表示?

          • jvm里面已经提前内置好了基本数据类型的实例

          • //基本类型的字节码
            Class<Integer> integerClass = int.class;
            Class<Long> longClass = long.class;
            
          • 包装类型里面提供了一个TYPE常量去获取基本数据类型的类实例

            public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
            
          • 使用字节码对象证明 int 和Integer不是同一类型

            Class<Integer> integerClass2 = int.class;
            Class<Integer> integerClass3 = Integer.class;
            System.out.println(integerClass2==integerClass3);//false
            

类的加载,超重要!!!

1,直接使用类.class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值