zoukankan      html  css  js  c++  java
  • 反射原理

    在理解反射的时候,不得不说一下内存。

    先理解一下JVM的三个区:堆区,栈区,和方法去(静态区)。

    堆区:存放所有的对象,每个对象都有一个与其对应的class信息。在JVM中只有一个堆区,堆区被所有的线程共享。

    栈区:存放所有基础数据类型的对象和所有自定义对象的引用,每个线程包含一个栈区。每个栈区中的数据都是私有的,其他栈不能访问。

    栈分为三部分:

       基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
    

    方法区:即静态区,被所有的线程共享。方法区包含所有的class和static变量。它们都是唯一的。

    在启动一个java虚拟机时,虚拟机要加载你程序里所用到的类 ,这个进程会首先跑到jdk中(在jdk的jre/lib/ext文件夹里找那些jar文件),如果没有找到,会去classpath里设置的路径去找。

    在找到要执行的类时:

    1.首先将找到的类的信息加载到运行时数据区的方法区。这个过程叫做类的加载。所以一下static类型的在类的加载过程中就已经放到了方法区。所以不用实例化就能用一个static类型的方法。

    2.加载完成后,在new一个类时,首先就是去方法区看看有没有这个类的信息。如果没有这个类的信息,先装载这个类。then,加载完成后,会在堆区为new的这个类分配内存,有了内存就有了实例,而这个实例指向的是方法区的该类信息。其实就是存放了在方法区的地址。而反射就是利用了这一点。

    下面是new一个类在内存中的动态。

    通过方法区的类型信息就可以反射出一个test实例来。即反射。

  • 相关阅读:
    最短路一类问题总结
    [Luogu] UVA1205 Color a Tree
    [Luogu] UVA1193 Radar Installation
    [Luogu] P2859 [USACO06FEB]Stall Reservations S
    [Luogu] P1248 加工生产调度
    [Luogu] P3694 邦邦的大合唱站队
    [Luogu] CF229D Towers
    windows server清理文件
    python连接ES进行数据过滤删除,新增查询、创建索引功能
    ES以更新时间为标准,分离数据
  • 原文地址:https://www.cnblogs.com/gloxing/p/8663788.html
Copyright © 2011-2022 走看看