ClassLoader类加载器浅见
类加载器
类加载器,它拿到.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类加载器浅见的更多相关文章
- ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制
ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...
- 进阶Java编程(11)ClassLoader类加载器【待完成】
1,ClassLoader类加载器简介 在Java里面提供一个系统的环境变量:ClassPath,这个属性的作用主要是在JVM进程启动的时候进行类加载路径的定义,在JVM里面可以根据类加载器而后进行指 ...
- 万万没想到,面试中,连 ClassLoader类加载器 也能问出这么多问题…..
1.类加载过程 类加载时机 「加载」 将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在内存上创建一个java.lang.Class对象用来封装类在方法区内的数据 ...
- Java安全之 ClassLoader类加载器
Java安全之 ClassLoader类加载器 0x00 前言 前面这里抛出一个问题,Java到底是什么类型的编程语言?是编译型?还是解释型?在这个问题是其实一直都都有疑惑,如果说是解释型语言的话,那 ...
- ClassLoader类加载器
总的来说,当动态加载一个资源时,至少有三种类加载器可供选择: 系统类加载器(也被称为应用类加载器)(system classloader) 当前类加载器(current classloader) 当前 ...
- Java URLClassLoader 和 ClassLoader类加载器
开始:看名字都带有ClassLoader,叫做类加载器,事实上是可以理解为动态的加载类,不过,也不是只能加载类,也可以加载其他形式的文件,比如说.properties属性文件. 区别:其实在两个类加载 ...
- JVM源码分析--ClassLoader类加载器
本人原创,转载请注明出处:https://www.cnblogs.com/javallh/p/10224187.html 1.JDK已有类加载器: BootStrap ClassLoader (启动类 ...
- java ClassLoader类加载器
原文 首先来了解一下字节码和class文件的区别: 我们知道,新建一个java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java ...
- java 反射,类的加载过程以及Classloader类加载器
首先自定义一个类Person package reflection; public class Person { private String name; public int age; public ...
随机推荐
- 读书笔记——吴翰清《白帽子讲Web安全》
目录 第一篇 世界观安全 一 我的安全世界观 第二篇 客户端脚本安全 一 浏览器安全二 跨站脚本攻击(XSS)三 跨站点请求伪造(CSRF)四 点击劫持(ClickJacking)五 HTML5 安全 ...
- 五、运算符的补充与if语句
1.可变不可变类型 指:对前面所学类型做一个可变和不可变类型的分类 可变类型:值改变,ID不变,证明改的是原值,原值是可以被改变的 不可变类型:值改变,ID也变了,证明是产生新的值,压根没有改变原值, ...
- 强化学习之七:Visualizing an Agent’s Thoughts and Actions
本文是对Arthur Juliani在Medium平台发布的强化学习系列教程的个人中文翻译,该翻译是基于个人分享知识的目的进行的,欢迎交流!(This article is my personal t ...
- 使用tensorflow的softmax进行mnist识别
tensorflow真是方便,看来深度学习需要怎么使用框架.如何建模- ''' softmax classifier for mnist created on 2019.9.28 author: vi ...
- python中的原地操作
什么是原地操作: 例子: 列表在append添加一个元素后,没有产生新副本,再次打印的时候多了一个值,这个appned就是原地操作 由此可见,原地操作有以下特点: 没有返回值(返回值为None) 改变 ...
- Java中使用RSA算法加密
Java中使用RSA算法加密 概述 RSA加密算法是一种非对称加密算法 RSA加密的方式 使用公钥加密的数据,利用私钥进行解密 使用私钥加密的数据,利用公钥进行解密 RSA是一对密钥.分别是公钥和私钥 ...
- U - Inviting Friends HDU - 3244( LIS 最长升序子序列——变形 )
序列变换 Problem Description 我们有一个数列A1,A2-An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要 ...
- SHTC3温湿度传感器的使用
1.SHTC3简单说明 SHTC3是一个检测温度.湿度的传感器,可以检测-40℃~125℃的温度范围和0%~100%的湿度范围. SHTC3的工作电压范围为:1.62V~3.6V. SHTC3使用的通 ...
- 第一章构建vue项目,代码仓库管理
一.安装node.js.vue-cli脚手架 1.安装node.js 下载地址:https://nodejs.org/en/download 查看版本号 node -v .npm -v 出现版本号即安 ...
- C语言中static extern的使用
10:30:22 2019-08-20 基础不牢 瞬间爆炸 参考资料:https://blog.csdn.net/ts_54eagle/article/details/4418627 https:// ...