自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(253)
  • 资源 (3)
  • 收藏
  • 关注

原创 运行时数据区内部结构

2020-05-31 23:42:58 173

原创 类的主动使用与被动使用等

2020-05-31 23:34:00 107

原创 沙箱安全机制

2020-05-31 23:30:17 280

原创 双亲委派机制的优势

package java.lang;public class Start { public static void main(String[] args) { System.out.println("hello!"); }}

2020-05-31 23:23:36 137

原创 双亲委派机制的工作原理及演示

package com.leon.java1;public class StringTest { public static void main(String[] args) { java.lang.String str = new java.lang.String(); System.out.println("hello,leon.com"); StringTest test = new StringTest(); Sy...

2020-05-31 23:05:27 202

原创 ClassLoader的常用方法及获取方法

ClassLoader类,是一个抽象类,其后所有的类加载器都继承自Classloader(不包括启动类加载器)

2020-05-31 22:57:00 1065

原创 为什么需要用户自定义类加载器及具体实现

1、在java的日常应用程序开发中,类的加载几乎是由上述三种类加载器相互配合执行的,在必要时,我们还需要自定义类加载器,来定制类的加载方式2、为什么要自定义类加载器 隔离加载类 修改类的加载方式 扩展加载源 防止源码泄露3、用户自定义类加载器的实现步骤...

2020-05-31 22:48:22 543

原创 引导类、扩展类、系统类加载器的使用及演示

一、启动类加载器(引导类加载器, Bootstrap ClassLoader)1、这个类是使用c/c++语言实现的, 嵌套在JVM内部。2、它用来加载java的核心库(java_home/jre/lib/rt.jar/resource.jar或sun.boot.class.path路径下的内容),用于提供jvm自身需要的类。3、并不继承自java.lang.ClassLoader,没有父加载器4、加载扩展类和应用程序类加载器,并指定为他们的父类加载器5、处于安全考虑,Bootstrap启动类..

2020-05-31 22:30:03 1022

原创 几种类加载器的使用体会

jvm支持两种类加载器,引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。从概念上讲,自定义加载器一般是指开发人员自定义的一类加载器,但是java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。上图中,Bootstrap Class Loader 为引导类加载器,其他的都为自定义类加载器。这里的四者的关系是包含关系,不是上层下层,也不是父子继承关系。也可以从..

2020-05-31 22:12:29 192

原创 类的加载过程三:Initialization

package com.leon.java;public class ClassInitTest { private static int num = 1; static{ num = 2; number = 20; System.out.println(num); //System.out.println(number);//报错:非法的前向引用。 } private static int number = 10...

2020-05-31 21:27:59 149

原创 类的加载过程二:Linking

package com.leon.java;public class HelloApp { private static int a = 1;//prepare:a = 0 ---> initial : a = 1 public static void main(String[] args) { System.out.println(a); }}

2020-05-31 21:23:25 181

原创 类的加载过程一:Loading

(1)通过一个类的全限定名获取定义此类的二进制字节码(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构(3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口...

2020-05-31 21:05:23 131

原创 概述类的加载器及类加载过程

类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件来头有特定的文件标识。Classloader只负责class文件的加载,至于它是否可以运行,由Excution Engine来决定。加载的类信息存放于一块成为方法区的空间,除了类信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常亮,这部分常量信息是class文件中常量池部分的内存映射。...

2020-05-31 20:54:00 121

原创 内存结构概述

2020-05-31 20:34:29 206

原创 Preconditions&Objects&assert讲解

package com.leon.guava.utilities;import com.google.common.base.Preconditions;import com.google.common.collect.ImmutableList;import org.junit.Test;import java.util.List;import java.util.Objects;import static org.hamcrest.core.Is.is;import static .

2020-05-31 17:44:55 250

原创 Guava Splitter详细讲解以及实战练习

package com..guava.utilities;import com.google.common.base.Splitter;import org.junit.Test;import java.util.List;import java.util.Map;import java.util.regex.Pattern;import static org.hamcrest.core.IsEqual.equalTo;import static org.hamcrest.core.I.

2020-05-31 17:17:49 177

原创 Joiner详细介绍以及和Java8Collector对比

package com.leon.guava.utilities;import com.google.common.base.Joiner;import com.google.common.io.Files;import org.junit.Test;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Arrays;import java.util.L...

2020-05-31 16:04:57 258

原创 线程上下文类加载器

线程上下文类加载器​ 在Java中存在着很多的服务提供者接口SPI,全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,这些接口一般由第三方提供实现,常见的SPI有JDBC、JNDI等。这些SPI的接口(比如JDBC中的java.sql.Driver)属于核心类库,一般存在rt.jar包中,由根类加载器加载。而第三方实现的代码一般作为依赖jar包存放在classpath路径下,由于SPI接口中的代码需要加载具体的第三方实现类并调用其相关方法,S

2020-05-30 19:31:32 195

原创 类的显式与隐式加载

类的显式与隐式加载​ 类的加载方式是指虚拟机将class文件加载到内存的方式。​ 显式加载是指在java代码中通过调用ClassLoader加载class对象,比如Class.forName(String name);this.getClass().getClassLoader().loadClass()加载类。​ 隐式加载指不需要在java代码中明确调用加载的代码,而是通过虚拟机自动加载到内存中。比如在加载某个class时,该class引用了另外一个类的对象,那么这个对象的字节码文件就会被虚拟

2020-05-30 19:22:33 882

原创 热部署类加载器

热部署类加载器​ 当我们调用loadClass方法加载类时,会采用双亲委派模式,即如果类已经被加载,就从缓存中获取,不会重新加载。如果同一个class被同一个类加载器多次加载,则会报错。因此,我们要实现热部署让同一个class文件被不同的类加载器重复加载即可。但是不能调用loadClass方法,而应该调用findClass方法,避开双亲委托模式,从而实现同一个类被多次加载,实现热部署。MyFileClassLoader myFileClassLoader1 = new MyFileClassLoa

2020-05-30 19:20:25 267

原创 自定义网络类加载器

package com.leon.base.classloader;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.InputStream;import java.net.MalformedURLException;import java.net.URL;public class MyURLClassLoader extends ClassLoader { private String .

2020-05-30 19:11:53 307

原创 自定义文件类加载器

自定义类加载器我们如果需要自定义类加载器,只需要继承ClassLoader类,并覆盖掉findClass方法即可。自定义文件类加载器package com.leon.base.classloader;import sun.applet.Main;import java.io.*;public class MyFileClassLoader extends ClassLoader { private String directory;//被加载的类所在的目录 /**

2020-05-30 19:05:36 171

原创 URLClassLoader的使用

URLClassLoader​ 在java.net包中,JDK提供了一个更加易用的类加载器URLClassLoader,它扩展了ClassLoader,能够从本地或者网络上指定的位置加载类。我们可以使用该类作为自定义的类加载器使用。构造方法:public URLClassLoader(URL[] urls):指定要加载的类所在的URL地址,父类加载器默认为系统类加载器。public URLClassLoader(URL[] urls, ClassLoader parent):指定要加载的类所

2020-05-30 18:47:17 2093

原创 ClassLoader简介

ClassLoader​ 所有的类加载器(除了根类加载器)都必须继承java.lang.ClassLoader。它是一个抽象类,主要的方法如下:loadClass​ 在ClassLoader的源码中,有一个方法loadClass(String name,boolean resolve),这里就是双亲委托模式的代码实现。从源码中我们可以观察到它的执行顺序。需要注意的是,只有父类加载器加载不到类时,会调用findClass方法进行类的查找,所以,在定义自己的类加载器时,不要覆盖掉该方法,而应该覆盖掉

2020-05-30 18:36:51 178

原创 类加载的双亲委派机制

类加载器的双亲委派机制​ 除了根类加载器之外,其他的类加载器都需要有自己的父加载器。从JDK1.2开始,类的加载过程采用双亲委派机制,这种机制能够很好的保护java程序的安全。除了虚拟机自带的根类加载器之外,其余的类加载器都有唯一的父加载器。比如,如果需要classLoader加载一个类时,该classLoader先委托自己的父加载器先去加载这个类,若父加载器能够加载,则由父加载器加载,否则才有classLoader自己加载这个类。即每个类加载器都很懒,加载类时都先让父加载器去尝试加载,一直到根类加载器

2020-05-30 18:29:13 204

原创 内置类加载器小结

小结​ 在程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,同时我们还可以自定义类加载器。需要注意的是,Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把加载类的请求交由父加载器处理,它一种任务委派模式。...

2020-05-30 18:20:25 175

原创 系统类加载器

系统类加载器(System)​ 系统类加载器也称之为应用类加载器,也是纯java类,是原SUN公司实现的sun.misc.Launcher类(是​AppClassLoader)。它的父加载器是扩展类加载器。它负责从classpath环境变量或者系统属性java.class.path所指定的目录中加载类。它是用户自定义的类加载器的默认父加载器。一般情况下,该类加载器是程序中默认的类加载器,可以通过ClassLoader.getSystemClassLoader()直接获得。public class

2020-05-30 18:18:08 518

原创 扩展类加载器

扩展类加载器(Extension)​ 扩展类加载器是指由原SUN公司实现的sun.misc.Launcher类(是​PlatformClassLoader类),它是由java语言编写,父加载器是根类加载器。负责加载<JAVA_HOME>\jre\lib\ext目录下的类库或者系统变量"java.ext.dirs"指定的目录下的类库。以下是ExtClassLoader加载目录源码:private static File[] getExtDirs() { String s =

2020-05-30 18:14:45 748

原创 根类加载器

类加载器​ 类的加载是由类加载器完成的。类加载器可以分为两种:第一种是Java虚拟机自带的类加载器,分别为启动类加载器、扩展类加载器和系统类加载器。第二种是用户自定义的类加载器,是java.lang.ClassLoader的子类实例。虚拟机内置加载器根类加载器(Bootstrap)​ 根类加载器是最底层的类加载器,是虚拟机的一部分,它是由C++语言实现的,且没有父加载器,也没有继承java.lang.ClassLoader类。它主要负责加载由系统属性“sun.boot.class.path”

2020-05-30 18:09:59 484

原创 类的加载连接和初始化

类的加载、连接和初始化​ 当Java程序中需要使用到某个类时,虚拟机会保证这个类已经被加载、连接和初始化。而连接又包含验证、准备和解析这三个子过程,这个过程必须严格的按照顺序执行。类的加载​ 通过类的完全限定名(包名和类名)查找此类的字节码文件,把类的.class文件中的二进制数据读入到内存中,并存放在运行时数据区的方法区内。然后利用字节码文件创建一个Class对象,用来封装类在方法区内的数据结构并存放在堆区内。这个过程是由类加载器完成的,我们后面会进行详细讲解。连接 验证:确保被加载

2020-05-30 18:05:00 161

原创 类加载器简介

类的加载概述我们编写的“.java”扩展名的源代码文件中存储着要执行的程序逻辑,这些文件需要经过java编译器编译成“.class”文件,".class"文件中存放着编译后虚拟机指令的二进制信息。当需要用到某个类时,虚拟机将会加载它,并在内存中创建对应的class对象,这个过程称之为类的加载。一个类的生命周期从类被加载、连接和初始化开始,只有在虚拟机内存中,我们的java程序才可以使用它。整个过程如下图所示:...

2020-05-30 18:00:12 112

原创 java读取指定package下的所有class

之前在看spring注解的时候,有看到再配置文件里面定义component scan package就能自动扫描对应包下面的class,然后根据注解生成相应的bean。自己对这个功能很好奇,就搜了下,找到了实现的关键代码,记录下。后续再对这段代码深入学习。/** * 从包package中获取所有的Class * * @param pack * @return */ public static Set<Class&lt.

2020-05-30 17:53:55 393

原创 Java 扫描并加载包路径下class文件

背景用过spring框架之后,有个指定扫描包路径,然后自动实例化一些bean,这个过程还是比较有意思的,抽象一下,即下面三个点如何扫描包路径下所有的class文件 如何扫描jar包中对应包路径下所有的class文件 如何加载class文件实现目标我们的目标是给定一个包路径,然后加载这个包路径下的所有class考虑两种场景包路径为依赖第三方jar包中的 包路径为自己的业务代码中的 --》 常见的一种是业务代码会编译成class文件,即扫描文件实现针对上面两种场景,分开说明

2020-05-30 17:50:58 1707

原创 类加载器-自定义-实现

package cn.leon.jvm.t3.load;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;public class Load7 { public static void main(String[] args) throws Exception { MyClassLoad.

2020-05-30 15:39:58 103

原创 类加载器-自定义

自定义类加载器问问自己,什么时候需要自定义类加载器 1)想加载非 classpath 随意路径中的类文件 2)都是通过接口来使用实现,希望解耦时,常用在框架设计 3)这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于 tomcat 容器步骤: 1. 继承 ClassLoader 父类 2. 要遵从双亲委派机制,重写 findClass 方法 注意不是重写 loadClass 方法,否则不会走双亲委派机制 3. 读取类文件的字节码...

2020-05-30 15:27:09 119

原创 类加载器-线程上下文

线程上下文类加载器我们在使用 JDBC 时,都需要加载 Driver 驱动,不知道你注意到没有,不写Class.forName("com.mysql.jdbc.Driver")也是可以让 com.mysql.jdbc.Driver 正确加载的,你知道是怎么做的吗?让我们追踪一下源码:public class DriverManager { // 注册驱动的集合 private final static CopyOnWriteArrayList<DriverInfo>

2020-05-30 15:04:05 124

原创 类加载器-双亲委派-源码分析2

public class Load5_3 { public static void main(String[] args) throws ClassNotFoundException { Class<?> aClass = Load5_3.class.getClassLoader() .loadClass("cn.leon.jvm.t3.load.H"); System.out.println(aClass.getClassLoader()); }}执行流程为: ...

2020-05-30 14:54:06 135

原创 类加载器-双亲委派-源码分析1

双亲委派模式所谓的双亲委派,就是指调用类加载器的 loadClass 方法时,查找类的规则注意protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 1. 检查该类是否已经加载 Class<?> c = findLoadedClass(name)

2020-05-30 14:45:25 112

原创 类加载器-扩展加载器

扩展类加载器public class G { static { System.out.println("classpath G init"); }}执行public class Load5_2 { public static void main(String[] args) throws ClassNotFoundException { Class<?> aClass = Class.forName("cn.itcast.jvm.t3.load.G"); Sy

2020-05-30 14:39:46 177

原创 类加载器-启动类加载器

启动类加载器用 Bootstrap 类加载器加载类:public class F { static { System.out.println("bootstrap F init"); }}执行public class Load5_1 { public static void main(String[] args) throws ClassNotFoundException { Class<?> aClass = Class.forName("cn.leon.j

2020-05-30 14:29:08 406

score.csv (score.csv)

load data local inpath '/export/servers/hivedatas/score.csv' into table score2 partition(year='2018',

2020-02-29

teacher.csv

load data local inpath '/export/servers/hivedatas/student.csv' overwrite into table student;

2020-02-29

student.csv

load data local inpath '/export/servers/hivedatas/student.csv' into table student;

2020-02-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除