字节码

Mybatis连接mysql数据库出现乱码

你。 提交于 2020-04-07 12:12:54
对于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基础加强--反射

余生长醉 提交于 2020-04-07 09:14:33
笔记摘要: 这里主要介绍了java类中的反射技术,其主要是应用在框架中,这里通过介绍和反射相关的几个类:Constructor、Filed、Method类 来 对 它们各自 的反射方式和应用进行了说明,另外还有数组的反射,同时对HashCode和HashSet集合进行了更深层次的理解,其中的 HashSet 集合中出现的内 存泄露问题是值得我们注意的。 一、反射的基石::Class类 Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class 1. Class类的各个实例对象: 对应各个类在内存中的字节码,例如Person类的字节码等 2. 字节码: 一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们 在内存中的内容是不同的,这一 个个空间可以分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class类型 3. 获取各个字节码对应的实例对象(Class类型)的方法 1> 静态方法,类名.class, 例如System.class Class cls = Person.class ; 2> 用字节码产生的对象获取 getClass(), 例如:new Date( ).getClass 3> Class.forName("类名"); 这种方式可以不用知道原来的类名

黑马程序员--java基础加强之反射(Reflection)

℡╲_俬逩灬. 提交于 2020-04-07 06:56:36
------- android培训 、 java培训 、期待与您交流! ---------- 反射 一、反射的基石-->Class类 1、java类的作用:是用来描述一类事物的共性,有什么属性,没有什么属性,至于属性的值是什么,则由这个类的实例对象来确定的,而不同的 实例对象就有不同的属性值。 2、Class类的产生:java程序中的各个java类也属于同一类事物,所以也可以用一个类来描述这些事物,这个类就是Class。 例如:众多的人需要建一个Person类,同理众多的类需要建一个Class类。 二、Class类介绍 1、创建Class类的的引用:Class class = 字节码(Person.class); 字节码:每个类编译后会产生一个.class文件,该文件就是字节码。 1)类名.class,如:System.class; 2)对象.getClass(),如:new Date().getClass(); 3)Class.forName("类名"),如:Class.forName("java.lang.String"); 该方法在反射中常用,用时将类名作为变量传入。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class ReflectionClass { public static

Class, Classloader与字节码

試著忘記壹切 提交于 2020-04-07 03:51:37
Class是对方法区(字节码)数据的倒排索引。是一种查找手段。 没有class,就没有办法对方法区进行快速索引。 java里面所有的类型包括枚举,注解,数组类型,原始类型,void等都是class。足以说明class对象有多重要。说明所有的操作都用到class或通过class实现的。 朔class是类的信息,还不如说class是类的运行时信息。你想,每次VM可能把一个真正的class放在任何地方,这个不确定性,就构成“信息”。 classloader的工作范围截止在class loading。名符其实。 class loading意味着装载就完事。装载意即:就像装入一个文件到内存-就是完成一个从IO到内存的复制。复制完以后需要把地址信息记下来。这些信息就是Class。 所以真正的Class与类并没有关系,而是关于运行时的信息。就是,类被装在了哪里,方法被装在了哪里。或者说,Class更多的是关于方法或类级的信息。因为域的意义在对象里,跟Class没什么关系。 关于classloader的边界或安全性,主要在于隔离并定义加载能力。 隔离加载能力好像不能对类安全有什么帮助,因为方法区没有隔离。可以通过直接访问方法区得到类数据(从而得到Class对象)。为什么还要隔离? 因为java语言不能访问内存。 因此说类加载器是防君子不防小人,防java不防本地代码。 但是本地代码可以被java

你必须会的 JDK 动态代理和 CGLIB 动态代理

邮差的信 提交于 2020-04-06 15:52:30
我们在阅读一些 Java 框架的源码时,基本上常会看到使用动态代理机制,它可以无感的对既有代码进行方法的增强,使得代码拥有更好的拓展性。 通过从静态代理、JDK 动态代理、CGLIB 动态代理来进行本文的分析。 静态代理 静态代理就是在程序运行之前,代理类字节码 .class 就已编译好,通常一个静态代理类也只代理一个目标类,代理类和目标类都实现相同的接口。 接下来就先通过 demo 进行分析什么是静态代理,当前创建一个 Animal 接口,里面包含 call 函数。 package top.ytao.demo.proxy; /** * Created by YangTao */ public interface Animal { void call(); } 创建目标类 Cat,同时实现 Animal 接口,下面是 Cat 发出叫声的实现。 package top.ytao.demo.proxy; /** * Created by YangTao */ public class Cat implements Animal { @Override public void call() { System.out.println("喵喵喵 ~"); } } 由于 Cat 叫之前是因为肚子饿了,所以我们需要在目标对象方法 Cat#call 之前说明是饥饿

java-反射

帅比萌擦擦* 提交于 2020-04-06 07:01:04
反射:在运行时期,通过反射可以动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息); 类的加载过程(加载机制):   1. 编码   2. 类的加载器去加载(将字节码文件加载到JVM中,给每个类创建字节码对象)   3. 初始化   4. 运行期 1. Class实例 其实就是一些类型(类 接口 数组 基本数据类型 void)的字节码对象 Class 类的实例表示正在运行的 Java 应用程序中的类和接口(字节码对象); 枚举是一种类,注释(指的是注解Annotation)是一种接口; 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象; 基本的 Java 类型( boolean 、 byte 、 char 、 short 、 int 、 long 、 float 和 double )和关键字 void 也表示为 Class 对象;    注意 :   1 、 Class 类 和它的实例的产生: Class 的实例是已经存在的类型, 所以不能够直接 new 一个 Class 对象出来 ,而通过已知的类型和 Class 来获得   2 、同一种类型不管通过什么方式得到 Class 的实例都是相等的; 一个类型的字节码对象只有一份 !     线程同步:同步监听对象 字节码对象来充当同步监听

图解JVM内存区域划分

你说的曾经没有我的故事 提交于 2020-04-06 05:26:26
图解JVM类加载机制和双亲委派模型 一文中讲述了 Java 类加载的过程,它包含 加载、验证、准备、解析、初始化、使用、卸载 这 7 个步骤。在准备阶段,JVM会将类加载到内存中,为类变量分配内存并赋予初值;在初始化阶段则会正式执行初始化代码。 那么在准备阶段和初始化阶段,JVM 具体是怎么为类分配内存的呢? JVM 把字节码文件加载进来之后放在哪里?代码运行的时候,方法和局部变量放在哪里?创建的对象又该放在哪里? 方法区/Metaspace:JVM加载进来的字节码文件会保存在方法区,Java8之后被称为Metaspace,里面保存类的基本信息。 字节码执行引擎:JVM 加载的字节码文件由字节码执行引擎来执行。 程序计数器:字节码是一行行的CPU指令,由CPU逐行执行,执行到哪一行了,就是由程序计数器来记录 栈内存:Java是多线程的,Java代码是由线程来执行的,每个线程都有各自的调用栈。执行方法时,栈帧进入调用栈,栈帧中有局部变量、方法返回值等信息。 堆内存:堆中保存Java创建的对象,栈中的局部变量可以持有堆中对象的引用。 最后我把整个过程串联一下: 有两个类,在使用时由JVM的类加载器进行加载,进入到方法区 由字节码执行引擎执行字节码文件 Java是多线程的,可以启动多个线程执行代码,每个线程都有自己的栈内存 执行方法,栈帧入栈,方法执行完成,栈帧出栈。栈帧中保存着局部变量

黑马程序员_java总结_反射

半腔热情 提交于 2020-04-06 03:56:03
----------- android培训 、 java培训 、java学习型技术博客、期待与您交流! ------------ 现在总结反射机制,个人感觉反射在JAVA中是相当重要的.我让为的反射:在java中执行一个 程序之前会先把其编译成class文件,而反射就是在运行时把已有的class文件进行反编 译的并在这个过程中,把类中的所有元素转换成JAVA中的类的一个过程,因为一个Class 文件就相当于一个类,那么反射就是以类为单位进行操作的了.对于反射的内容包括以下 几点: 1.类的字节码(Class) 2.反射时的构造方法. 3.反射时的普通方法. 4.反射时的成员变量. 1.类的字节码(Class) 要想实现反射,在JAVA中就必须借助与Class类,它是反射的基础.每一个类在编译时 都会被编译成.class 文件.而在运行时,JVM会把这些要用到的文件加载到内存中, 这时这些文件就是以一段段的字节码的形式表示的,而这些字节码也被java封装成了 一个对象,这个对象就是Class,而java中 实现反射就是以一个Class为单位操作的, 所以要实现反射就必须先有这么一个对象了.要想得到Class类的实例有三种方式: 1.类名.class;如: Class clazz = String.class; 2.调用Class类的静态方式forName方法,它有几个重载形式

Python什么情况下会生成pyc文件?

这一生的挚爱 提交于 2020-04-06 03:32:45
作为Python爱好者,需要了解.py脚本的基本运行机制及特性: 在很多工作上Python的运行流程基本上取决于用户,因此源码不需要编译成二进制代码(否则无法实现大部分贴近用户的特性),而直接从源码运行程序。当我们运行python文件程序的时候,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。 因此总的来说,它具有以下三条特性 源码距离底层更远(根据官方文档的解释。不说,你们也感觉得到。) 运行时都需要生成字节码,交由虚拟机执行。(你们问我虚拟机在哪儿?!你们也不看看各自都是用什么软件执行的!没错,就是解释器,别和我说是IDLE啊。虚拟机具体实现了由switch-case语句构成的框架函数PyEval_EvalFrameEx,刚刚说的字节码就是这货执行的。) 每次执行脚本,虚拟机总要多出加载和链接的流程。(所以呢,相比于编译型语言就有点慢了。这与“有丝分裂间期”一样,准备东西也要花时间啊!) 那么,有人要问了:“不是说,运行时总要生成字节码么!那,字节码都去哪儿了?” 咳咳,别急!容我先说说,虚拟机它是怎么执行脚本的: 完成模块的加载和链接; 将源代码翻译为PyCodeObject对象(这货就是字节码),并将其写入内存当中(方便CPU读取,起到加速程序运行的作用); 从上述内存空间中读取指令并执行; 程序结束后,根据命令行调用情况(即运行程序的方式

JVM源码分析之javaagent原理完全解读

我只是一个虾纸丫 提交于 2020-04-05 20:58:09
概述 本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员,而且agent都是用Java编写的,不需要太多的C/C++编程基础,不过这篇文章里也会讲到JVMTIAgent(C实现的),因为javaagent的运行还是依赖于一个特殊的JVMTIAgent。 对于javaagent,或许大家都听过,甚至使用过,常见的用法大致如下: java -javaagent:myagent.jar=mode=test Test 我们通过-javaagent来指定我们编写的agent的jar路径(./myagent.jar),以及要传给agent的参数(mode=test),在启动的时候这个agent就可以做一些我们希望的事了。 javaagent的主要功能如下: 可以在加载class文件之前做拦截,对字节码做修改 可以在运行期对已加载类的字节码做变更,但是这种情况下会有很多的限制,后面会详细说 还有其他一些小众的功能 获取所有已经加载过的类 获取所有已经初始化过的类(执行过clinit方法,是上面的一个子集) 获取某个对象的大小 将某个jar加入到bootstrap classpath里作为高优先级被bootstrapClassloader加载 将某个jar加入到classpath里供AppClassloard去加载 设置某些native方法的前缀