字节码

Tomcat 简介

梦想与她 提交于 2020-04-04 11:17:52
Tomcat 软件介绍 Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。Tomcat 最初是由 Sun 的软件架构师詹姆斯●邓肯●戴维森开发的。后来他将其变为开源项目,并有 Sun 贡献给 Apache 软件基金会。由于大部分开源项目 O'Reilly 都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。因为他希望这种动物能够自己照顾自己,最终,他将其命名为 Tomcat(公猫)。而 O'Reilly 出版的介绍 Tomcat 的书籍的封面也被设计成了一个公猫的形象。而 Tomcat 的 Logo 兼吉祥物也被设计成了一只公猫。 其实 Tomcat 最早在开始研发的时候并不叫这个名字,早期的 Tomcat 的 Logo 项目的名字叫 Catalina,所以当我们安装完 Tomcat 后会发现安装路径下有很多 Catalina 有关的目录和文件。这些文件是我们配置或使用 Tomcat 的重要文件所在。 Tomcat 应用场景 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,应用在中小型系统和并发访问用户不是很多的场合,是开发和调试 JSP 页面的首选

JVM系列十(Class 文件结构).

不想你离开。 提交于 2020-04-03 19:39:33
一、Class 文件结构 JDK 的版本号已经到 14 了,相对于语言、API 以及 Java 技术体系中其他方面的变化,Class 文件结构一直处于比较稳定的状态,Class 文件的主体结构、字节码指令的语义和数量几乎没有出现过变动。 Class 文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 根据 Java 虚拟机规范的规定,Class 文件格式采用一种类似于 C 语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表: 无符号数:以 u1、u2、u4、u8 来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照 UTF-8 编码构成字符串值。 表:由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性的以“_info” 结尾,用于描述有层次关系的复合结构的数据,整个 Class 文件本质上就是一张表。 下面是 Class 文件格式: 类型 名称 数量 描述 u4 magic 1 表示这个文件是否为一个能被虚拟机接受的 Class 文件 u2 minor_version 1 次版本号 u2 major_version 1 主版本号

浅谈JDK、JRE、JVM区别与联系

好久不见. 提交于 2020-04-03 15:01:23
浅谈JDK、JRE、JVM区别与联系 摘要 JDK是 Java 语言的软件开发工具包(SDK)。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre。 一、JDK JDK(Java Development Kit) 是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JDK是java开发工具包,基本上每个学java的人都会先在机器 上装一个JDK,那他都包含哪几部分呢?在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre。有这样一个关系,JDK包含JRE,而JRE包 含JVM。 bin:最主要的是编译器(javac.exe) include:java和JVM交互用的头文件 lib:类库 jre:java运行环境 1234 (注意:这里的bin、lib文件夹和jre里的bin、lib是 不同的) 总的来说JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。 二

Java学习笔记一(基础知识)

走远了吗. 提交于 2020-04-01 15:15:52
1 java基本概念 JDK java develop Kit Java开发环境,三种版本J2SE(主要用与桌面和小程序的开发)、J2EE(主要用户企业级的开发)、J2ME(主要用于手持设备的开发) Jre Java run environment Java运行环境, 2 java的基本特点   1)简单:java的编程风格类似C++、除去C++中容易产生错误指针,结构,枚举等、封装了很多类库。   2)面向对象的:完全面向对象的,支持继承、重载、多态等机制   3)健壮性:检查程序在编译或者运行时候的错误、强类型的语言、提供垃圾内存回收机制,避免内存泄露问题。   4)安全性:删除了指针和内存管理,避免内存泄露、java安全架构能够来确保java的操作是安全的。   5)解释性:java是解释执行的,由编译器把java源程序编译成字节码后,有java的解释器执行。   6)与平台无关性:java源程序编程成语平台无关的字节码,有解释器来解释执行。字节码是在JVM上运行的。   7)多线程的:在语言级支持多线程编程;   8)动态性:面向对象的扩展,允许程序在运行过程中动态的添加所需要的类。java编译器把符号信息在字节码中保存下来,传递给解释器,再有解释器         完成动态链接类后,将符号引用信息转化为数值偏移量。 3 java 跨平台的原理  

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

我是研究僧i 提交于 2020-04-01 07:47:43
class文件简介及加载   Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规则生成的、具体class文件是怎样组织类信息的,可以参考 此博文: 深入理解Java Class 文件格式系列。 或者是 Java虚拟机规范 。 下面通过一段代码演示手动加载 class文件字节码到系统内,转换成class对象,然后再实例化的过程: a. 定义一个 Programmer类: package samples; /** * 程序猿类 * @author louluan */ public class Programmer { public void code() { System.out.println("I'm a Programmer,Just Coding....."); } } b. 自定义一个类加载器: package samples; /** * 自定义一个类加载器,用于将字节码转换为class对象 * @author louluan */ public class MyClassLoader extends

java反射详解

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

Android ART运行时与Dalvik虚拟机

隐身守侯 提交于 2020-03-28 05:22:15
这几天在做一个项目时需要在Android中使用OSGi框架(Apache Felix),于是在一个android 4.4.2 版本系统的某品牌的平板上实验。 实验内容很简单:把felix包里的felix.jar包和一些bundles的jar包用android sdk里的dx及aapt工具转化为包含dex字节码的jar 包。这样使这些jar包能在Android上跑起来。(因为Android上使用的是在Dalvik虚拟机而不是标准的java虚拟机,所以“原生”的 jar包不能直接在Android上跑) 然后当我把所有的jar包转换后拷贝到已有的那台Android平板上运行它们时却报出这样的错误: java.lang.unsupportedOperationException: can`t load this type of class file. 当时还以为是jar包转换时出错了,然后删掉了所有的包,重新下载重新转换,不料还是报这样的错。 纠结了一天后,也想到可能是因为art与Dalvik模式的问题。于是把同样的jar包拷贝到自己的Android手机(4.4.4版本运行于dalvik模式)上居然顺利运行了。然后把手机调为art模式再次运行jar包就又报平板上的报出的错误。 ART(Android Runtime) ART 是一种执行效率更高且更省电的运行机制,ART模式在Android

关于计算机编程语言——编译型和解释型_2

家住魔仙堡 提交于 2020-03-28 03:02:29
目前,我们都是采用高级语言编程(写汇编和机器语言的大牛们除外),但是计算机只能识别二进制( 机器语言),不能直接理解高级语言 ,所以我们必须把高级语言“ 翻译”成计算机能够理解的机器语言。 说到“ 翻译“, 其实总共有两种方式: 1. 编译: 通过编译系统(不仅仅只是通过编译器,编译器只是编译系统的一部分)把高级语言“ 翻译 ”成机器语言(具体翻译过程可以参看下图), 把源高级程序编译成为机器语言文件,比如windows下的exe文件。 一个完整的编译系统与 一个用C编写的程序hello.c的编译过程 2. 解释:解释型程序在运行的时候才“ 翻译 ”,比如VB语言,在执行的时候,专门有一个解释器将VB语言“ 翻译 ”成机器语言, 每条语句都是执行的时候才翻译。 编译型与解释型,两者各有利弊: 1、 编译型语言:一次编译完成后,可以直接运行, 程序执行效率高 ; 解释型语言:执行时才“翻译”成机器语言,解析一行,“ 翻译 ”一行,执行一行,程序执行效率相对较低; 但是不能一概而论, 部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。 2、由于 编译型程序 执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它, 像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言;

Java面试之JVM

♀尐吖头ヾ 提交于 2020-03-27 15:27:43
194. 说一下 JVM 的主要组成部分?及其作用? 类加载器(ClassLoader) 运行时数据区(Runtime Data Area) 执行引擎(Execution Engine) 本地库接口(Native Interface) 组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。 195. 说一下 JVM 运行时数据区? 不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分: 程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成; Java 虚拟机栈(Java Virtual Machine

Java动态代理之一CGLIB详解

我的未来我决定 提交于 2020-03-24 09:59:33
在上篇文章《 Java代理模式及动态代理详解 》中我们介绍了Java中的静态代理模式与动态代理模式,并以JDK原生动态代理作为示例进行讲解。本篇文章我们来介绍一下基于CGLIB实现的动态代理,并与原生动态代理进行对比。 CGLIB介绍 CGLIB(Code Generation Library)是一个开源、高性能、高质量的Code生成类库(代码生成包)。 它可以在运行期扩展Java类与实现Java接口。Hibernate用它实现PO(Persistent Object 持久化对象)字节码的动态生成,Spring AOP用它提供方法的interception(拦截)。 CGLIB的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类。但不鼓励大家直接使用ASM框架,因为对底层技术要求比较高。 使用实例 首先,引入CGLIB的依赖: <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.5</version> </dependency> 这里我们以操作用户数据的UserDao为例,通过动态代理来对其功能进行增强(执行前后添加日志)。UserDao定义如下: public class UserDao { public void findAllUsers(){