字节码

Java 反射与注解

对着背影说爱祢 提交于 2019-11-29 19:05:00
反射与注解 Java 从源码到执行一般需要三个过程: 编译并生成字节码文件,即 class 文件或者 jar 包 JVM 加载字节码文件并初始化运行环境,例如将字节码翻译成机器指令、初始化对象、加载依赖包等 执行 Java 程序 和 C/C++ 这类系统级编程语言相比,Java 多了生成字节码文件与翻译字节码文件这些中间步骤,这是 Java 实现“一次编译处处执行”的基础,也是反射和注解的底层基础。相同的字节码在不同的平台下会被 JVM 翻译成不同的机器指令,从而实现跨平台执行。 Java 提供了一种机制,允许我们在载入(创建)类对象时修改对象中的属性,这种机制基于 JVM:JVM 在将字节码翻译为机器指令的过程中可以修改对象属性的值,可以为对象添加其他方法等等。程序员可以通过 Java 内置的一些方法使用 JVM 的部分特性。 反射与类中的 Class 对象 维基百科 对计算机科学中的反射解释如下: In computer science, reflection is the ability of a process to examine, introspect, and modify its own structure and behavior. 在计算机科学中,反射是运行时查看与 修改 自身结构和行为的能力。 Java 中运行时可以通过反射修改属性和方法的访问限制(例如从

JVM参数调优:Eclipse启动实践

十年热恋 提交于 2019-11-29 16:23:26
JVM参数调优:Eclipse启动实践 本文主要参考自 《深入理解 Java 虚拟机》 。 这本书是国人写的难得的不是照搬代码注释的且不是废话连篇的技术书,内容涵盖了 Java 从源码到字节码到执行的整个过程,包括了 JVM(Java Virtual Machine)的架构,垃圾收集的介绍等。这里摘录出关于配置 JVM 基本参数来调优 Eclipse 启动的过程,比较初级,供初学者参考。 基础知识 针对 JVM 的参数调优主要集中在数据区大小的控制和垃圾回收策略的选择。关于 JVM 运行机制等更多内容可参考 其他博文 JVM 的运行时数据区 运行时 JVM 的数据区主要包括各线程私有的栈和程序计数器,线程共享的方法区,以及管理对象的堆(又称回收堆)等。程序运行时,类信息、常量、静态变量等会被加载到方法区。运行过程中几乎所有对象都在堆里,内存占用的空间最大,这也是最值得优化得部分。 JVM 的垃圾回收策略 Java 程序中,除了基本类型(primitive types),其他的数据都是以对象的形式存在。对象生命周期有长有短,如果无区别的保留在内存中,会造成内存超载。内存垃圾回收(Garbage Collection, 缩写 GC)就是解决这一问题的策略。 注意:JVM 不仅仅只对对象进行垃圾回收,实际上也会对废弃常量和无用的类做回收。 垃圾回收首先得找到需要被回收的对象

通过Java字节码发现有趣的内幕之初始化篇(三)

核能气质少年 提交于 2019-11-29 15:41:16
关于类初始化过程网上有很多相关的文章,其实也算是学习语言时一个基础知识,但今天我想从字节码表现上更深入的来理解各种场景下的实例初始化过程是怎么样的,从简单到复杂大体分为下面几个场景 。 1、成员+构造函数 2、成员+代码块+构造函数 3、 静态变量+静态代码块 4、 继承和多态 首先明确下运行环境 : 我们先来看一下第一个场景: 成员+构造函数,也是我们最经常使用到的场景。在这个场景中想通过字节码了解下成员属性的初始情况,下图左边代码 声明了四个类成员属性和一个无入参构造函数 ,右边是对应的执行字节码栈帧执行顺序。 1、 在字节码(1)处隐示的调用了类的父默认构造函数,这个很重要,决定了类的多重初始化过程,详细在最后一个场景展开; 2、代码中myId1和myId2属性声明方式不同,初始化过程也是不一样的,如图中所示,myId1在声明属性时未进行任何的指令操作,而是等到构造函数中的myId1=100时才有执行指令,而像myId2在声明就进行赋值指令 ,所以myId2会被myId2优先初始化 。 3、myText2在声明时赋于null,所以我们可以看到指令也会进行aconst_null的操作,但是在(6)时再次对myText2进行了赋值并再次产生了指令操作。注:null本身不是一种对象,在JVM中没有明确的指明采用什么类型,不同的JVM实现可能不一样

mybatis连接mysql数据库插入中文乱码

て烟熏妆下的殇ゞ 提交于 2019-11-29 15:10:18
对于mysql数据库的乱码问题,有两中情况: 1. mysql数据库编码问题(建库时设定)。 2. 连接mysql数据库的url编码设置问题。 对于第一个问题,目前个人发现只能通过重新建库解决,建库的时候,选择UTF-8字符集。我试过修改现有数据库字符集为UFT -8,但是根本不起作用,插入的中文仍然乱码(中文显示成:???)。重建库时选择字符集为UTF-8之后,中文正常显示了。 对于第二个问题,是这样 的情况:我建库时设置了数据库默认字符集为UTF-8,通过mysql workbench直接插入中文显示完全正常。但是使用mybaits插入数据时,中文显示成了"???"这样的乱码。但从数据库获取的中文不会乱码。跟 踪数据库操作,SQL语句中的中文还是显示正常的,但是插入到mysql数据库后就乱码了,于是判断可能是数据库连接的问题。后来在网上找了下资料,发现 确实可以为mysql数据库的连接字符串设置编码方式,如下: jdbc:mysql://127.0.0.1:3306/test? useUnicode=true&characterEncoding=utf8 添加了 useUnicode=true&characterEncoding=utf8 参数之后,插入中文就正常了。 添加的作用是:指定字符的编码、解码格式。 例如:假设mysql数据库用的是GBK编码(也可能是其它

Java面试-第十九部分答案

强颜欢笑 提交于 2019-11-29 13:56:52
194+195+196 Java虚拟机主要分为以下五个区: 一、方法区(METHOD AREA): 1. 有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载 2. 方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。 3. 该区域是被线程共享的。 4. 方法区里有一个运行时常量池,用于存放静态编译产生的字面量和符号引用。该常量池具有动态性,也就是说常量并不一定是编译时确定,运行时生成的常量也会存在这个常量池中。 5.个人理解的方法区就是封装了一个java class 的所有信息 二、堆 (HEAP) java堆是所有线程所共享的一块内存,在虚拟机启动时创建,几乎所有的对象实例都在这里创建,因此该区域经常发生垃圾回收操作。 三、虚拟机栈(JAVA STACK): 1. 虚拟机栈也就是我们平常所称的栈内存,它为java方法服务,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接和方法出口等信息。 2. 虚拟机栈是线程私有的,它的生命周期与线程相同。 3. 局部变量表里存储的是基本数据类型、returnAddress类型(指向一条字节码指令的地址)和对象引用,这个对象引用有可能是指向对象起始地址的一个指针,也有可能是代表对象的句柄或者与对象相关联的位置

《Python基础篇》之初识Python一

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-29 13:24:00
Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 Python和其他语言的对比: C 和 Python、Java、C#等 C语言: 代码编译得到 机器码 ,机器码在处理器上直接执行,每一条指令控制CPU工作 其他语言: 代码编译得到 字节码 ,虚拟机执行字节码并转换成机器码再后在处理器上执行 Python 和 C Python这门语言是由C开发而来   对于使用:Python的类库齐全并且使用简洁,如果要实现同样的功能,Python 10行代码可以解决,C可能就需要100行甚至更多.   对于速度:Python的运行速度相较与C,绝逼是慢了 Python 和 Java、C#等   对于使用:Linux原装Python,其他语言没有;以上几门语言都有非常丰富的类库支持   对于速度:Python在速度上 可能 稍显逊色 所以,Python和其他语言没有什么本质区别,其他区别在于:擅长某领域、人才丰富、先入为主。 Python的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。 Jyhton

Python基础(一)参数、变量、输入、流程控制与缩进、while循环

折月煮酒 提交于 2019-11-29 13:23:43
本章内容: Python 的种类 Python 的环境 Python 入门(解释器、编码、pyc文件、脚步传入参数、变量、输入、流程控制与缩进、while循环) 练习题 Python 的种类 Cpython   Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。 Jyhton   Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。 IronPython  Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似) PyPy(特殊)   Python实现的Python,将Python的字节码字节码再编译成机器码。 RubyPython、Brython .. . Python的对应关系和执行流程如下: PyPy 在Python的基础上对Python的字节码进一步处理,从而提升执行速度! Python 的环境 Windows: 下载地址:https://www.python.org/downloads/ Linux : 自带python环境 #python -V 查看python版本 nick-suo@ubuntu:~$ python -V Python 2.7

Python基础(一)

心已入冬 提交于 2019-11-29 13:22:44
本章内容: Python 的种类 Python 的环境 Python 入门(解释器、编码、pyc文件、脚步传入参数、变量、输入、流程控制与缩进、while循环) 练习题 Python 的种类 Cpython   Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上。 Jyhton   Python的Java实现,Jython会将Python代码动态编译成Java字节码,然后在JVM上运行。 IronPython  Python的C#实现,IronPython将Python代码编译成C#字节码,然后在CLR上运行。(与Jython类似) PyPy(特殊)   Python实现的Python,将Python的字节码字节码再编译成机器码。 RubyPython、Brython .. . Python的对应关系和执行流程如下: PyPy 在Python的基础上对Python的字节码进一步处理,从而提升执行速度! Windows: 下载地址:https://www.python.org/downloads/ Linux: 自带python环境 #python -V 查看python版本 nick-suo@ubuntu:~$ python -V Python 2.7.6 nick-suo

java面试题1

ぃ、小莉子 提交于 2019-11-29 13:19:29
1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点: 没有面向对象易维护、易复用、易扩展 面向对象 优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点: 性能比面向过程低 2. Java 语言有哪些特点 简单易学; 面向对象(封装,继承,多态); 平台无关性( Java 虚拟机实现平台无关性); 可靠性; 安全性; 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持); 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便); 编译与解释并存; 3. 什么是 JDK 什么是 JRE 什么是 JVM 三者之间的联系与区别 这几个是Java中很基本很基本的东西,但是我相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成的编译工具以及环境的时候,并没有去考虑这些东西。 JDK: JDK(Java Development Kit)顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的

注解

雨燕双飞 提交于 2019-11-29 12:09:24
注解 概念: 说明程序的,jdk1.5之后 jdk中预定义的一些注解 @override :检测该注解标注的方法是否是继承自父类(接口)的 @Deprecated : 该注解标注的内容,表示已过时 @SuppressWarnings:压制警告 @SuppressWarnings("all"),压制所有警告 自定义注解 格式: public @interface 注解名称{ 属性列表 } 本质:本质上是一个接口,该接口默认继承Annotation接口 通过反编译可以知道:public interface myAnno extends java.lang.annotation.Annotation {} 属性:接口中的抽象方法 要求: 1,属性的返回值类型有一下几种,其余不行 基本数据类型 String 枚举:赋值: = 枚举类名.value 注解 = @注解名 以上类型的数组 = {value1,value2,...} ,2,在使用定义的属性时,给属性赋值 例如int age();使用时: @ano(age = 1); 如果在注解内定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值 例如int age()default 1;使用时: @ano(); 如果只有一个属性需要赋值,并且属性的名称是value则value可以省略,直接使用值 例如int