字节码

java的反射

白昼怎懂夜的黑 提交于 2020-03-22 23:09:48
反射 是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、 反射 的概述 JAVA 反射 机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的 反射 机制。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象. 以上的总结就是什么是 反射 反射 就是把 java 类中的各种成分映射成一个个的 Java 对象 例如:一个类有:成员变量、方法、构造方法、包等等信息,利用 反射 技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。 (其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述) 如图是类的正常加载过程: 反射 的原理在与class对象。 熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。 其中这个Class对象很特殊。我们先了解一下这个Class类 二、查看Class类在 java 中的api详解(1.7的API) 如何阅读 java 中的api详见 java 基础之——String字符串处理 Class

编译型和解释型语言

时光怂恿深爱的人放手 提交于 2020-03-21 16:40:29
目前,常用的解释性语言有 Perl,Python, Lisp/Scheme,Ruby等,究竟什么是解释性语言呢? 所谓的解释性语言主要包括两个方面:以使他们都有自己的解释器,也可以通俗的理解为翻译器;二是他们都是在其他的编译语言(通常是C语言)的基础上定义和扩充了自己的语法结构。 解释性语言的工作原理就是用自己定义的解释其解释并执行有自己定义的语法结构生成的程序代码。所以解释性语言并不编译。这里要区分Java,因为Java并不是单单是一门解释性语言,他为了提高效率而拥有他自己的即时解释器,实际上Java可以算作一门解释和编译的结合语言。 编译型和解释型语言: 计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能值型高级语言编写的程序。 翻 译的方式有两种,一个是编译,一个是解释。两种方式只是翻译的时间不同。编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的 文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语 言的程序执行效率高。 解释则不同,解释性语言的程序不需要编译,省了道工序,解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译

JVM

旧时模样 提交于 2020-03-20 11:07:57
Java虚拟机(JVM)是运行Java字节码的虚拟机 JVM可以理解的代码叫做字节码(.class文件) Java程序从源代码到运行一般分3步 : .java文件 -> .class文件 -> 机器可以执行的二进制机器码 字节码到机器码的过程中,JVM 类加载器首先加载字节码文件,然后通过解释器 逐行解释执行,这个方式的执行速度会比较慢,而且,有些方法和代码块是经常被调用,所有后面引进了JIT编译器,而JIT属于运行时编译。当JIT编译器完成第一次编译后,会将字节码对应的机器码保存下来,下次可以直接使用。所以说java是编译与解释共存的语言。 来源: https://www.cnblogs.com/holdoncomeon/p/12530015.html

java程序从编译到运行

房东的猫 提交于 2020-03-17 17:24:55
一.编译过程 使用javac 编译程序 java源文件被jvm中的编译器编译为.class文件(byteCode) 当编译某个类时,如果该类依赖的类还没有编译 ,则会去优先编译依赖的类,然后引用 编译后的byteCode文件包含常量池和方法区两部分 常量池主要包括源文件中的常量、类名、成员变量等以及符号引用(类引用、方法引用等) 方法区主要包括各个方法的字节码 二.运行过程 java + 运行过程分为类加载和类执行两步 首先要了解jvm的基本组成 1.类加载 首先会在内存中创建一个jvm进程,然后根据环境变量中的classpath将字节码文件读入到内存中,通常是以字节数组形式读入,字节码文件中的类信息会加载到运行时数据区的方法区(只有将类信息加载至方法区,才可以创建对象,使用成员变量) 引用一段类加载器的说明: 类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、 系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader 的子类)。从 Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM 更好的保证了 Java 平台的安全性, 在该机制中,JVM 自带的 Bootstrap 是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载

java简介

纵饮孤独 提交于 2020-03-17 08:34:40
1.1 java平台简介 java se :java标准版,主要用于桌面机应用和数据库的开发。 java ee :java企业版,提供企业级开发的各种技术,主要用于企业级开发,现在用的最多的就是这个。 java me :java micro edition,这个版本主要用于嵌入式和移动式的开发,最常用的就是手机应用软件的开发。 jdk:java development kit. jdk目录及说明: (1)bin:jdk的基本程序都在这里,如javac,java,javadoc; (2)demo:java的一些例子程序; (3)jre:java的运行环境; (4)lib:java的类库; (5)src:java类库的源代码; 1.3 程序开发过程 (1)创建一个源文件。java源文件就是java代码,以Java语言编写。Java源文件是纯文本文件,扩展名为“.java”。可以用任何文本编辑器来创建和编辑源文件。 (2)将源文件编译为一个.class文件。使用jdk所带的编译工具javac.exe,它会读取源文件并将其文本文件编译为Java虚拟机能理解的指令,保存后缀以.class结尾的文件中。包含在class文件中的指令就是众所周知的字节码(bytecodes),它是与平台无关的二进制文件,执行时由解释器java.exe解释成本地机器码,边解释边执行。 (3)运行程序

Java面试系列01:Java基础之JVM

那年仲夏 提交于 2020-03-17 05:33:36
参考链接: JVM之内存结构详解 https://www.choupangxia.com/2019/10/18/jvm%E4%B9%8B%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84%E8%AF%A6%E8%A7%A3/ 绪论 1.什么是Java虚拟机? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 2.为什么Java被称作是“平台无关的编程语言”? 一般的高级语言如要在不同的平台上运行,至少需要编译成不同的目标代码。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。而引入JVM后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。 3.jvm最大内存限制多少? 默认是物理内存的1/64,JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。 一、Java 类加载过程? 类加载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。 在java中类装载器把一个类装入JVM,经过以下步骤: 加载

JVM 基础(1) -- Java 的内存结构

只谈情不闲聊 提交于 2020-03-16 19:54:31
以黄小斜博文为主的学习总结 文章目录 1. 了解 JVM 内存有什么好处 2. JVM 主要组成部分 3. 运行时数据区的五大组成部分 1. 程序计数器 2. Java 虚拟机栈 3. 本地方法栈 4. Java 堆 5. 方法区 4. 控制各区域大小的参数 1. 了解 JVM 内存有什么好处 所有的 Java 开发人员可能会遇到这样的困惑:我该为堆内存设置多大空间呢?OutOfMemoryError 的异常到底涉及到运行时数据区的哪块区域?该怎么解决呢? 其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解 JVM 内存可以帮助我们在服务器出现性能问题的时候,快速的了解哪块内存区域出现了问题,以便快速的解决生产故障。 2. JVM 主要组成部分 JVM 主要由 类加载器 、运行时数据区 、执行引擎和本地库接口四部分组成。 JVM 工作的流程大致就是:首先由类加载器将我们的 .class 文件加载进运行时数据区,然后 JVM 会在堆中创建一个对应类的 Class 对象,但由于我们的字节码只是 JVM 的一套指令集规范,并不能直接交给底层的操作系统去执行,所以这里就需要用到特定的字节码解析器执行引擎将我们的字节码解析成底层操作系统可以执行的机器指令,然后交由 CPU 去执行,在执行的过程中可能还需要用到其他语言的本地库接口进而完成整个程序的功能。 3.

Java类载入器(二)——自己定义类载入器

ε祈祈猫儿з 提交于 2020-03-16 17:59:53
  用户定制自己的ClassLoader能够实现以下的一些应用: 自己定义路径下查找自己定义的class类文件,或许我们须要的class文件并不总是在已经设置好的Classpath以下,那么我们必须想办法来找到这个类,在这样的清理下我们须要自己实现一个ClassLoader。 确保安全性:Java字节码非常easy被反编译,对我们自己的要载入的类做特殊处理,如保证通过网络传输的类的安全性。能够将类经过加密后再传输,在加密到JVM之前须要对类的字节码在解密。这个过程就能够在自己定义的ClassLoader中实现。 实现类的热部署:能够定义类的实现机制。假设我们能够检查已经载入的class文件是否被改动,假设改动了。能够又一次载入这个类。   findClass()的功能是找到class文件并把字节码载入到内存中。自己定义的ClassLoader一般覆盖改方法。以便使用不同的载入路径,然后调用defineClass()解析字节码。   defineClass()方法用来将byte字节流解析成JVM能够识别的Class对象。 有了这种方法意味着我们不仅仅能够通过class文件实例化对象。还能够通过其它方式实例化对象,如我们通过网络接收到一个类的字节码,拿这个字节码流直接创建类的Class对象形式实例化对象。   自己定义的载入器能够覆盖方法loadClass()以便定义不同的载入机制。

什么是反射?

时光毁灭记忆、已成空白 提交于 2020-03-16 11:12:19
1.对象有编译类型和运行类型 Object obj = new java.util.Date(); 编译类型:Object 运行类型(其实就是obj对象真实的类型):java.util.Date 需求:根据对象obj调用Date类中的一个方法,toLocaleString,如何来做? obj.toLocaleString()代码在编译阶段去编译类型Object中检查是否有该方法,若没有,编译失败. 1.对象有编译类型和运行类型 Object obj = new java.util.Date(); 编译类型:Object 运行类型(其实就是obj对象真实的类型):java.util.Date 需求:根据对象obj调用Date类中的一个方法,toLocaleString,如何来做? obj.toLocaleString()代码在编译阶段去编译类型Object中检查是否有该方法,若没有,编译失败. 解决方案1:强制转换obj为Date类型,前提:必须知道对象的真实类型是什么? Date d = (Date)obj; d.toLocaleString();//YES 如果我不知道obj的真实类型,那又如何去调用toLolcaeString方法. 如何去做? 解决方案2: 使用反射 对象使用类描述的,但是Java中一些皆对象,其实所有的类,底层都有一个字节码对象

反射笔记

江枫思渺然 提交于 2020-03-16 11:11:29
目录 类的生命周期: 类的主动使用被动使用和类的初始化时机: 反射的使用: Class.forName()读取配置文件举例 通过反射获取构造方法并使用 通过反射获取成员变量并使用 通过反射获取方法并使用 通过反射越过泛型检查 通过反射写一个通用的方法,设置某个对象的某个属性为指定的值 小练习: 动态代理的概述和实现 关于反射的更详细讲解可以看这位博主 https://blog.csdn.net/sinat_38259539/article/details/71799078 类的生命周期: 在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过加载,链连接,初始化这3个步骤完成。 类加载器工作机制: 类的加载是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象。用来封装数据。 但是同一个类只会被类加载器加载一次 1:加载:指将类的class文件读入内存,并为之创建一个java.lang.Class对象,即当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。 2:连接就是把二进制数据组装为可以运行的状态。 连接分为验证,准备,解析这3个阶段 验证:一般用来确认此二进制文件是否适合当前的JVM(版本)