类加载器

类加载器,它拿到.class文件,它会把他拆成两部分,将static数据转换成方法区的数据结构,然后把他放在了方法区之中。

然后在堆里面建一个类对象(Class,它可以用来实例化对象),然后可以通过这个类对象找到位于方法区的static数据。、

注意:访问对象是从栈去找,然后在从访问对象,而这个堆分为两部分(堆,方法区(特殊的堆)).

  • package Reflection;
    public class Test05 {
    public static void main(String[] args) throws ClassNotFoundException {
    //获取系统类加载器
    ClassLoader systemClassLoader =ClassLoader.getSystemClassLoader();
    System.out.println (systemClassLoader);
    //测试父类加载器(Extention ClassLoader)
    ClassLoader parent = systemClassLoader.getParent ();
    System.out.println (parent);
    //扩展类加载器父类加载器,根(引导类)加载器,这个用户是获取不到的,最高一层
    ClassLoader gradepa = parent.getParent ();
    System.out.println (gradepa);
    //测试当前类是哪个加载器加载的
    ClassLoader classLoader = Class.forName ("Reflection.Test05").getClassLoader ();
    System.out.println (classLoader);
    //测试JDK内部类是由谁加载的,Object是最高级的了,创建它的类就是引导类加载器,也是不允许获取的
    classLoader = Class.forName ("java.lang.Object").getClassLoader ();
    System.out.println (classLoader);
    //获取java的扩展类
    System.out.println (System.getProperty("java.class.path"));
    }
    }
    结果:
    sun.misc.Launcher$AppClassLoader@dad5dc
    sun.misc.Launcher$ExtClassLoader@16d3586
    null
    sun.misc.Launcher$AppClassLoader@dad5dc
    null
    C:\jdk\jre\lib\charsets.jar;C:\jdk\jre\lib\deploy.jar;C:\jdk\jre\lib\ext\access-bridge.jar;C:\jdk\jre\lib\ext\cldrdata.jar;C:\jdk\jre\lib\ext\dnsns.jar;C:\jdk\jre\lib\ext\jaccess.jar;C:\jdk\jre\lib\ext\jfxrt.jar;C:\jdk\jre\lib\ext\localedata.jar;C:\jdk\jre\lib\ext\nashorn.jar;C:\jdk\jre\lib\ext\sunec.jar;C:\jdk\jre\lib\ext\sunjce_provider.jar;C:\jdk\jre\lib\ext\sunmscapi.jar;C:\jdk\jre\lib\ext\sunpkcs11.jar;C:\jdk\jre\lib\ext\zipfs.jar;C:\jdk\jre\lib\javaws.jar;C:\jdk\jre\lib\jce.jar;C:\jdk\jre\lib\jfr.jar;C:\jdk\jre\lib\jfxswt.jar;C:\jdk\jre\lib\jsse.jar;C:\jdk\jre\lib\management-agent.jar;C:\jdk\jre\lib\plugin.jar;C:\jdk\jre\lib\resources.jar;
    C:\jdk\jre\lib\rt.jar;
    D:\project\JavaTest2\out\production\JavaTest2;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\lib\idea_rt.jar

class对象在堆里面。对象一般都比较大,所以全放在堆里面(堆相当于一本书的内容部分)

自问自答:

类缓存?

顾名思义,就是一个类如果被放倒类加载器中,加载完了之后,还会保留一段时间。

类加载器分类?分三类(引导区加载器,扩展类加载器,系统类加载器),层次由高到底

测试当前类是哪个加载器加载的,测试JDK内置的类是由谁加载的,如何获得类加载器的加载路径?

ClassLoader返回的是一串字符串,先用ClassLoader.getSystemClassLoader可以获取系统类加载器,然后通过getParent()再往上获取。

双亲委派机制(就是优先启用系统原有的jar包,你写的就算一模一样他也不用。)!

类加载内存分析

public class Test03 {
public static void main(String[] args) {
A a = new A ();
System.out.println (a.m);
}
}
class A{
static{
m = 300;
System.out.println ("静态方法在讲话,当前的m"+A.m);
}
static int m = 100;
public A() {
System.out.println ("构造方法启动了,当前的m"+m);
}
}
结果:
静态方法在讲话,当前的m=300
构造方法启动了,当前的m=100
100

ClassLoader类加载器浅见的更多相关文章

  1. ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制

    ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...

  2. 进阶Java编程(11)ClassLoader类加载器【待完成】

    1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指 ...

  3. 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..

    1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...

  4. Java安全之 ClassLoader类加载器

    Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那 ...

  5. ClassLoader类加载器

    总的来说,当动态加载一个资源时,至少有三种类加载器可供选择: 系统类加载器(也被称为应用类加载器)(system classloader) 当前类加载器(current classloader) 当前 ...

  6. Java URLClassLoader 和 ClassLoader类加载器

    开始:看名字都带有ClassLoader,叫做类加载器,事实上是可以理解为动态的加载类,不过,也不是只能加载类,也可以加载其他形式的文件,比如说.properties属性文件. 区别:其实在两个类加载 ...

  7. JVM源码分析--ClassLoader类加载器

    本人原创,转载请注明出处:https://www.cnblogs.com/javallh/p/10224187.html 1.JDK已有类加载器: BootStrap ClassLoader (启动类 ...

  8. java ClassLoader类加载器

    原文 首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java ...

  9. java 反射,类的加载过程以及Classloader类加载器

    首先自定义一个类Person package reflection; public class Person { private String name; public int age; public ...

随机推荐

  1. 手把手教你用GoEasy实现Websocket IM聊天

    经常有朋友问起GoEasy如何实现IM,今天就手把手的带大家从头到尾用GoEasy实现一个完整IM聊天,全套代码已经放在了github. 今日的前端技术发展可谓百花争鸣,为了确保本文能帮助到使用任何技 ...

  2. Spring Data JPA 自定义对象接收查询结果集

    Spring Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据库的访问和 ...

  3. MS15-034漏洞复现、HTTP.SYS远程代码执行漏洞

    #每次命令都百度去找命令,直接弄到博客方便些: 漏洞描述: 在2015年4月安全补丁日,微软发布的众多安全更新中,修复了HTTP.sys中一处允许远程执行代码漏洞,编号为:CVE-2015-1635( ...

  4. hdu1908 逆序对

    题目链接:https://www.luogu.com.cn/problem/P1908 这个题不要以为拿到手就可以树状数组秒,本题的数据范围是1e9显然简单的树状数组是空间不够的,点个数有5e5,所以 ...

  5. sql-lib闯关1-10关

    闯关之前我们需要搭建所需环境SQLi-Labs SQLi-Labs是一个专业的SQL注入练习平台,该平台包含了以下在测试场景中常见的注入类型: 1.报错注入(联合查询) ​     1)字符型 ​   ...

  6. MySQL的死锁系列- 锁的类型以及加锁原理

    疫情期间在家工作时,同事使用了 insert into on duplicate key update 语句进行插入去重,但是在测试过程中发现了死锁现象: ERROR 1213 (40001): De ...

  7. 使用条件随机场模型解决文本分类问题(附Python代码)

    对深度学习感兴趣,热爱Tensorflow的小伙伴,欢迎关注我们的网站!http://www.tensorflownews.com.我们的公众号:磐创AI. 一. 介绍 世界上每天都在生成数量惊人的文 ...

  8. Ubuntu系统下命令行查看自己已安装的桌面环境问题

    原因:有时我们进行远程连接时需要知道我们的Ubuntu系统已安装的桌面环境,这时我们可以使用[dpkg]命令. [dpkg]:dpkg命令是Debian Linux系统用来安装.创建和管理软件包的实用 ...

  9. 请问一下大佬们,我的项目compile编译的时候总是编译报错

    这是执行compile编译的结果 这是加上参数-X之后的结果

  10. 通用mapper常用注解

    通用mapper的作用: 自动实现单表的增删改查 常用注解使用 @Table 作用:建立实体类和数据库表之间的对应关系. 默认规则:实体类类名首字母小写作为表名.Employee 类→employee ...