首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java反射机制及其使用

,然后堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口。...加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口(即引用地址)。...准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。...虚拟机会保证一个类的()方法多线程环境中被正确加锁和同步。...实际对象还是通过调用类的无参构造函数创建的, 若没有无参构造函数,则报错。 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供参的构造器 2.参的构造器的访问权限得够。

50330
您找到你想要的搜索结果了吗?
是的
没有找到

快速了解Java虚拟机(JVM)以及常见面试题(持续更新中......)

native: 使用native关键字,会去调用底层的c语言的库 进入本地方法栈,调用本地方法的本地接口 JIN JIN作用:扩展java的使用,融合不同的语言为java所有 方法区主要存放...堆、元空间(方法区)是线程共享的;其他区域是线程私有的 特点及作用: 1、线程共享的一块区域; 2、虚拟机启动创建; 3、虚拟机所管理的内存中最大的一块区域; 4、存放所有实例对象或数组;...逻辑存在,物理上不存在 新生区: ​ 类诞生和成长,直到死亡的地方 ​ 所有的对象都在伊甸园区new出来 老年代: ·当新生代经历15次轻GC后还存在引用的,则被转移到老年代 永久区:...null;常量赋正式值; 解析:把符号引用翻译为直接引用; 初始化:当我们new一个类的对象,访问一个类的静态属性,修改一个类的静态属性,调用一个类的静态方法,用反射API对一个类进行调用,初始化当前类...对象没有在任何地方被引用,如不能在任何地方通过反射访问该类的方法

40930

《深入理解java虚拟机》笔记(8)类的加载机制

一、类加载机制 类加载器将类的.class文件中的二进制数据读入到内存中,将其放在方法区内,然后堆区创建一个java.lang.Class对象,用来封装类方法区内的数据结构。...将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。...加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储方法区之中,而且Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。...4、解析 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,解析动作主要针对类或接口、字段、类方法、接口方法方法类型、方法句柄和调用点限定符7类符号引用进行。...()方法和()方法区别 执行时机不同:init方法对象构造器方法new一个对象调用对象的constructor方法才会执行。

21550

java类的加载机制

一、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后堆区创建一个 java.lang.Class对象,用来封装类方法区内的数据结构...将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 Java堆中生成一个代表这个类的 java.lang.Class对象,作为对方法区中这些数据的访问入口。...加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储方法区之中,而且Java堆中也创建一个 java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。...我们可以理解为static final常量在编译期就将其结果放入了调用它的类的常量池中 4、解析(连接阶段的第三步):把类中的符号引用转换为直接引用 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程...,解析动作主要针对类或接口、字段、类方法、接口方法方法类型、方法句柄和调用点限定符7类符号引用进行。

37520

类加载器

通过此实例的 newInstance()方法就可以创建出该类的一个对象。...类加载器的代理模式 类加载器尝试自己去查找某个类的字节代码并定义它,会先代理给其父类加载器,由父类加载器先去尝试加载这个类,依次类推。...所有 Java 应用都至少需要引用 java.lang.Object类,也就是说在运行的时候,java.lang.Object这个类需要被加载到 Java 虚拟机中。...类加载器成功加载某个类之后,会把得到的 java.lang.Class类的实例缓存起来。下次再请求加载该类的时候,类加载器会直接使用缓存的类的实例,而不会尝试再次加载。...也就是说,对于一个类加载器实例来说,相同全名的类只加载一次,即 loadClass方法不会被重复调用

51030

JVM 学习笔记(一)

(1)通过一个类的全限定名获取定义此类的二进制字节流 (2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 (3)Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口...(3)Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口 说白了就是类文件被类装载器装载进来之后,类中的内容(比如变量,常量,方法对象等这些数 据得要有个去处...常规理解: Method Area(方法区) 方法区是各个线程共享的内存区域,虚拟机启动创建。 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。...Heap(堆) Java堆是Java虚拟机所管理内存中最大的一块,虚拟机启动创建,被所有线程共享。 Java对象实例以及数组都在堆上分配。...如果线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址; 如果正在执行的是Native方法,则这个计数器为

45220

原来Java反射这么简单!!!

反射机制框架设计中举足轻重,现在市面上绝大部分框架基本都有使用Java的反射机制。例如加载数据库驱动的,用到的也是反射。...反射机制 概念 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。...例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。 如图是类的正常加载过程:反射的原理与class对象。...作用 可以程序的运行过程中,动态操作这些对象 可以解耦,提高程序的可扩展性 常用类 Java.lang.Class; Java.lang.reflect.Constructor; Java.lang.reflect.Field...args): * 参数说明: * obj : 要调用方法对象; * args:调用方式所传递的实参

20730

Java成神路 —— 类加载器

类的加载 就是指将class文件读入内存,并为之创建一个 java.lang.Class 对象 任何类被使用时,系统都会为之建立一个 java.lang.Class 对象 3....类的初始化时机 创建类的实例 调用类的类方法 访问类或者接口的类变量,或者为该类变量赋值 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 初始化某个类的子类 直接使用java.exe...类加载器的作用 将Class文件字节码内容加载到内存中,并将这些静态数据转成方法区的运行时数据结构,然后再堆中生成一个代表整个类的Java.lang.Class对象,作为方法区中类数据的访问入口。...Class,先让父类加载器试图加载该Class,只有父类加载器无法加载该类尝试从自己的类路径中加载该类 缓存机制:保证所有加载过的Class都会被缓存,当程序需要使用某个Class对象,类加载器先从缓存区中搜索该...Class,只有当缓存区中不存在该Class对象,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存储到缓存区 3.

14210

【原创】JVM 的类加载机制?盘它!

之后,Java虚拟机会再创建一个java.lang.Class对象实例,这个实例将作为访问方法区中A类信息的入口。...加载之后,二进制文件会被读入到虚拟机所需的格式存储方法区中,方法区中存储格式由虚拟机自行定义,然后java堆中实例化一个java.lang.Class对象,通过这个对象就可以访问方法区中的数据。...操作实例属性的JVM指令为: getfield —— 从对象中获取字段 putfield —— 设置对象中字段的值 操作实例方法的JVM指令为: invokespecial —— 根据编译类型来调用实例方法...如果一个类被直接引用,就会触发类的初始化。 Java 中,直接引用的情况有: 通过 new 关键字实例化对象、读取或设置类的静态变量、调用类的静态方法。 通过反射方法执行以上三种行为。...常量在编译期间会存入调用类的常量池中,本质并没有直接引用定义常量的类,不会触发定义常量所在的类。 通过类名获取 Class 对象,不会触发类的初始化。

74420

面试官:说说类加载的几个阶段

对于“什么时候初始化”,Java 虚拟机规范有明确的规定,当符合以下条件(包括但不限),并且虚拟机在内存中没有找到对应的类信息,必须对类进行“初始化”操作: 使用new实例化对象,读取或者设置一个类的静态字段或方法...三、类的加载过程 当一个类需要被加载到虚拟机中执行时,虚拟机会通过类加载器,将其.class文件中的字节码信息在内存中转化成一个具体的java.lang.Class对象,以便被调用执行。...3.在内存中生成一个代表这个.class文件的java.lang.Class对象,作为方法区这个类的各种数据的访问入口,一般这个java.lang.Class对象会存在 Java 堆中 虚拟机规范对这三点的要求并不具体...,创建一个java.lang.Class类的对象,这个对象描述了这个类所有的信息,同时提供了这个类方法区的访问入口。...与此同时,方法区中,使用同一加载器的情况下,每个类只会有一份Class字节流信息;堆内存中,使用同一加载器的情况下,每个类也只会有一份java.lang.Class类的对象

14710

JVM 学习笔记1-类加载子系统

并生成 java.lang.class 对象,这个对象将作为程序访问方法区中的这些类型数据的外部接口。...java.lang.Class 对象,这个对象将作为程序访问方法区中的这些类型数据的外部接口。...解析(Resolve) 虚拟机将常量池中的符号引用转换成直接引用(class 文件很小,先存放指向所需要类的符号,解析引用) 针对类、接口、字段方法等7类符号引用进行转换 没有规定解析阶段发生的具体时间...//非法的前向引用声明变量之前,可以去给这些变量进行赋值,但是不能够调用它。...类构造器方法 ( ) 和类构造器( ) 并不是一回事 ( ) 方法不需要定义,而( ) 需要定义(不定义但是会有个默认为的构造器方法) 只有当代码中包含 static 变量,才会执行 ( )

17560

02 Java类的加载机制

1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后堆区创建一个java.lang.Class对象,用来封装类方法区内的数据结构。...将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。...加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储方法区之中,而且Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。...解析 解析:把类中的符号引用转换为直接引用 解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,解析动作主要针对类或接口、字段、类方法、接口方法方法类型、方法句柄和调用点限定符 7类符号引用进行...并且只有调用了newInstance() 方法采用调用构造函数,创建类的对象

62370

类加载

加载 加载也就是把class文件加载到虚拟机内存中。加载虚拟机需要完成3个方面的工作: 通过一个类的全限定名来获取类的二进制字节流。 将字节流所代表的静态存储结构转化为方法区中的运行时数据结构。...在内存中生成一个代表这个类的java.lang.Class对象。...加载完成后,虚拟机将这个二进制流存储虚拟机的方法区中,并且通过在内存中生成的java.lang.Class对象可以访问方法区中的类型数据。...解析主要分为下面的几种: 类或接口的解析 字段解析 类方法解析 接口方法解析 初始化 初始化阶段主要的目的是为静态变量或者静态代码块执行赋值的操作。...i); //编译出错 静态代码块只能访问它之前定义的静态变量 } static int i = 1; }

48030

Java基础-类加载器和核心机制

准备: 正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配 解析: 虚拟机常量池内的符号引用替换为直接引用的过程 初始化: 初始化阶段是执行类构造器<clinit...当初始化一个类的时候,如果发现其父类还没有进行过初始化、则需要先出发其父类的初始化 虚拟机会保证一个类的()方法多线程环境中被正确加锁和同步。...类的主动引用(一定会发生类的初始化) new一个类的对象 调用类的静态成员(除了final常量)和静态方法 使用java.lang.reflect包的方法对类进行反射调用虚拟机启动,java Hello...说白了就是先启动main方法所在的类 当初始化一个类,如果其父类没有被初始化,则先会初始化他的父类 类的被动引用(不会发生类的初始化) 当访问一个静态域,只有真正声明这个域的类才会被初始化 通过子类引用父类的静态变量...区中的运行时数据结构,堆中生成一个代表这个类的java.lang.Class 对象,作为方法区类数据的访问入口。

54220

【面经】闪送Java一面面经(

如果当前线程执行的是一个 Java 方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是本地(Native)方法,则是(Undefined)。...2、Java 虚拟机栈(VM Stack)Java 虚拟机栈也是线程私有的,每个线程创建都会创建一个虚拟机栈,生命周期与线程相同。...4、堆(Heap)Java堆是被所有线程共享的一块内存区域,虚拟机启动创建。它是Java内存管理的核心区域,用来存放 Java 对象实例,几乎所有的 Java 对象实例都被直接分配在堆上。...从 JDK1.7 开始已经默认开启逃逸分析,如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈分配内存。...该机制的基本原则是:当一个类加载器收到类加载请求,它首先不会自己去尝试加载,而是将请求委派给父类加载器去完成。每个类加载器都是如此,只有父类加载器无法完成加载,子类加载器才会尝试自己去加载。

27030

JVM之类加载子系统

java.lang.Class对象,作为方法区这个类的各种数据的访问入口 三、链接过程 ?...解析(Resolve) 将常量池内的符号引用转换为直接引用的过程。 事实,解析操作往往会伴随着JVM执行完初始化之后再执行 符号引用就是一组符号来描述所引用的目标。...(关联:构造器是虚拟机视角下的init()) 若该类具有父类,jvm会保证子类的clinit()执行前,父类的clinit()已经执行完毕 虚拟机必须保证一个类的clinit()方法多线程下被同步加锁...双亲委派机制 介绍 ​ Java虚拟机对class文件采用的是按需加载的方式, ​ 也就是说当需要使用该类才会将她的class文件加载到内存生成的class对象。 ​...,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的. 2、对类加载器的引用 JVM必须知道一个类型是有启动类加载器加载的还是由用户类加载器加载的

38120

初探JVM,只需要这篇文章!

双亲委派机制 定义:如果一个类加载器接到加载类的请求,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务...)Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口 说白了就是类文件被类装载器装载进来之后,类中的内容(比如变量,常量,方法对象等这些数据得要有个去处...,虚拟机启动创建,被所有线程共享。...比如通过主函数main调用其他方法,这种方式实际是main线程执行之后调用方法,即要想使用里面的各种内容,得要以线程为单位,执行相应的方法才行。 那一个线程执行的状态如何维护?...解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。 解析动作主要针对类或接口、字段、类方法、接口方法方法类型、方法句柄和调用限定符7类符号引用进行。

35820

理解java中反射,区别Class.forName(),Class.forName().instance() ,new,如果获取对象中的方法和字段「建议收藏」

将原程序翻译成计算机语言,就是二进制代码,java中是将.java文件也就是源程序翻译成.class的字节码 什么是编译?...就是可以程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成对象。...就是该类真正起作用,如:有该类的对象实例,或该类调用了静态方法属性等 那么如何实现反射呢? 要正确使用Java反射机制就得使用java.lang.Class这个类。它是Java反射机制的起源。...当一个类被加载以后,Java虚拟机就会自动产 生一个Class对象。通过这个Class对象我们就能获得加载到虚拟机当中这个Class对象对应的方法、成员以及构造方法的声明和定义等信息。...三种方式得到Class对象: 1.调用对象的getClass方法,返回该对象的Class对象。 2.Class.forName(“类的完整名字”);可以类不确定的情况下实例化Class,最灵活。

78920

jvm总览-让我们从头开始,带官网解释

)Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口 3.2 链接(Link) 3.2.1 验证(Verify) 保证被加载类的正确性 文件格式验证...(3)Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口 说白了就是类文件被类装载器装载进来之后,类中的内容(比如变量,常量,方法对象等这些数据得要有个去处...5.3 常规理解 5.3.1 Method Area(方法区) 方法区是各个线程共享的内存区域,虚拟机启动创建。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。...,虚拟机启动创建,被所有线程共享。...比如通过主函数main调用其他方法,这种方式实际是main线程执行之后调用方法,即要想使用里面的各种内容,得要以线程为单位,执行相应的方法才行。 那一个线程执行的状态如何维护?

41010
领券