当前位置:首页 » 编程语言 » java类加载器

java类加载器

发布时间: 2022-05-26 03:43:09

java:如何编写自己的Java类加载器

给你简单介绍一下类加载器

1.类加载器就加载字节码文件(.class)

public class FileClassLoader extends ClassLoader {String rootDir=null;public FileClassLoader(String rootDir) {this.rootDir = rootDir;}@Overrideprotected Class<?> findClass(String className) throws ClassNotFoundException {//首先检查是否已经被加载了。Class<?> c = findLoadedClass(className);String path = rootDir + "/" + className.replace('.', '/') + ".class";if (c != null) {return c;} else {/*双亲委托模式*/ClassLoader loaderParent = this.getParent();c = loaderParent.loadClass(className);if (c != null) {return c;} else {/*如果再不行的话,就再进行加载。因为字节码的本质就是一个字节数组*/InputStream is = null;ByteArrayOutputStream outputStream = new ByteArrayOutputStream();try {is = new FileInputStream(path);byte[] buffer = new byte[1024];int len = 0;while ((len = is.read(buffer)) != -1) {outputStream.write(buffer, 0, len);}c = defineClass(className, buffer, 0, buffer.length);}catch (Exception e) {e.printStackTrace();}finally {if (is != null) {try {is.close();}catch (IOException e) {e.printStackTrace();}}}}return c;}}

}

/*

相同的类加载器对同一个类进行加载,得到的hascode是相同的

* 不同的类加载器对同一类进行加载,得到的hascode是不一样的*/public class Demo {public static void main(String[] args) {FileClassLoader loader = new FileClassLoader("c://myjava");FileClassLoader loader2=new FileClassLoader("c://myjava");try {Class<?> c = loader.findClass("com.lg.test.HelloWorld");Class<?> c0=loader.findClass("com.lg.test.HelloWorld");Class<?> c1=loader2.findClass("com.lg.test.HelloWorld");Class<?> c2=loader.findClass("com.lg.test.Demo01");Class<?> c3=loader.findClass("java.lang.String");System.out.println(c.hashCode());System.out.println(c.getClassLoader());System.out.println(c0.hashCode());System.out.println(c0.getClassLoader());System.out.println(c1.hashCode());System.out.println(c1.getClassLoader());System.out.println(c2.hashCode());System.out.println(c2.getClassLoader());System.out.println(c3.hashCode());System.out.println(c3.getClassLoader());}catch (ClassNotFoundException e) {e.printStackTrace();}}}

⑵ 描述一下JVM加载class文件的原理

Java语言是一种具有动态性的解释型语言,类(class)只有被加载到JVM中后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。这个加载过程是由类加载器来完成的,具体来说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。
类的加载方式分为隐式加载与显式加载两种。隐式加载指的是程序在使用new等方法创建对象时,会隐式地调用类的加载器把对应的类加载到JVM中。显式加载指的是通过直接调用class.forName()方法来把所需要的类加载到JVM中。
任何一个工程项目都是由许多个类组成的,当程序启动时,只把需要加载的类加载到JVM中,其他类只有被使用到的时候才会被加载,采用这种方法,一方面可以加快加载速度,另外一方面可以节约程序运行过程中对内存的开销。此外,在Java语言中,每个类或接口都对应一个.class文件,这些文件可以被看成一个个可以被动态加载的单元,因此当只有部分类被修改时,只需要重新编译变化的类即可,而不需要重新编译所有文件,因此加快了编译速度。

⑶ Java 类加载器怎么实现将同一个对象加载两次

类A中有一个字段a,它的类型为X
类B中有一个字段b,它的类型也为X
类A由classLoaderA所加载,类B由classLoaderB所加载
执行赋值语句A.a
=
B.b,由于这两个类型均为X,可以执行,但是有一个要求,这个要求就是在A中所装载类X的装载器必须和在B中装载类X的装载器相同,否则赋值语句失败!

⑷ java的类加载器有哪些,它们的顺序是什么

类加载器有四种,分别是 bootstrapClassLoader (主要加载java核心api) , ExtClassLoaders是扩展类的类加载器,AppClassLoader 程序类加载器,还有一个是用户继承ClassLoader重写的类加载器。

⑸ java中类加载器是怎么工作的

JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)
链接又分为三个步骤,验证、准备、解析
1) 装载:查找并加载类的二进制数据;
2)链接:
验证:确保被加载类的正确性;
准备:为类的静态变量分配内存,并将其初始化为默认值;
解析:把类中的符号引用转换为直接引用;
3)初始化:为类的静态变量赋予正确的初始值;
那为什么我要有验证这一步骤呢?首先如果由编译器生成的class文件,它肯定是符合JVM字节码格式的,但是万一有高手自己写一个class文件,让JVM加载并运行,用于恶意用途,就不妙了,因此这个class文件要先过验证这一关,不符合的话不会让它继续执行的,也是为了安全考虑吧。
准备阶段和初始化阶段看似有点牟盾,其实是不牟盾的,如果类中有语句:private static int a = 10,它的执行过程是这样的,首先字节码文件被加载到内存后,先进行链接的验证这一步骤,验证通过后准备阶段,给a分配内存,因为变量a是static的,所以此时a等于int类型的默认初始值0,即a=0,然后到解析(后面在说),到初始化这一步骤时,才把a的真正的值10赋给a,此时

⑹ 在java中,什么是类加载器子系统

java中的类要加载到jvm中才能使用,那么把java类加载到jvm中的工具,就是类加载器。
java内置3种类加载器,BootstrapClassLoader,ExtClassLoader,SystemClassLoader(可能名字不对),第一个是加载jvm启动时需要的类和一些基本java类库,它不是java写的;另外两个都是java写的,用来加载其它java类。
用户自己写的类一般用SystemClassLoader加载,因为它的加载路径是classpath,可以自己设定,一般都会把项目路径设进去

⑺ java类加载器有几种

Java中加载器的种类大致可以分为四种:Bootstrap ClassLoader(由C++语言写成),系统加载器(也就是内部类AppClassLoader),ExtClassLoader,以及java.net.UrlClassLoader.
当我们运行一个程序时,首先是找到JDK安装目下的jvm.dll来启动JAVA虚拟机,而后Bootstrap ClassLoader产生,接下来就是Bootstrap ClassLoader来加载ExtClassLoader,并且指定ExtClassLoader的父加载器为Bootstrap ClassLoader,但是因为Bootstrap ClassLoader用C++语言写的,所以用JAVA的观点来看,这个加载器的实例是不存在的,所以ExtClassLoader的父加载器被设置为了null,然后就是Bootstrap ClassLoader将AppClassLoader装载,并指定其父加载器为ExtClassLoader。
JAVA是按照加载器的委派模型来实现的。这种模型是JAVA安全性机制的保证。并且值得我们注意的就是这几个加载器的默认加载类的路径。对于AppCLassLoder来说,它的路径也就是我们的classpath里面的路径。而对于ExtClassLoader来说,它的路径是jre\lib\ext\classes.对于URLClassLoader来说,它的加载路径是我们指定的url。

⑻ Java的ServiceLoader有多个类加载器

JVM有三种类加载器:bootstrap负责加载系统类,extclassloader负责加载扩展类,appclassloader负责加载应用类。他们主要是分工不一样,各自负责不同的区域,另外也是为了实现委托模型。什么是委托模型呢,其实就是当类加载器有加载需求的时候,先请示他的父类使用父类的搜索路径来加入,如果没有找到的话,才使用自己的搜索路径来来搜索类。
当执行 java ***.class 的时候, java.exe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。
下面的图形可以表示三者之间的关系:
BootstrapLoader <---(Extends)----AppClassLoader <---(Extends)----ExtClassLoader
这三个加载器就构成我们的 Java 类加载体系。他们分别从以下的路径寻找程序所需要的类:
BootstrapLoader : sun.boot.class.path
ExtClassLoader: java.ext.dirs
AppClassLoader: java.class.path
这三个系统参量可以通过 System.getProperty() 函数得到具体对应的路径。大家可以自己编程实现查看具体的路径。

⑼ Java面试题, 类加载器,加载顺序的问题,不太懂结果为什么是这样 结果是1,0

类加载时,按顺序执行静态成员变量初始化。
最先初始化 singleton = new Singleton(); 构造方法中 counter1++ 后 counter1 为 1,counter2++ 后 counter2 为1。
然后初始化 counter2 = 0,counter2 从 1 变成 0。
注意,public static int counter1 这是变量声明,不会像 counter2 = 0 这样在初始化阶段设成 0 。

⑽ java中反射、类加载器、动态代理之间的关系

你最好把结合框架 i/o复习好 还有多线程 线程池和反射 复习好 内加载器和代理 就问一下定义 老师给的现场笔试都是i/o 和集合框架
反射是Java的最重要的底层知识。而动态代理其实质就是依靠反射来实现的。

反射是通过字节码文件对象,将类的字段,方法,构造器等映射成相应的类,并进行各自的操作;
类加载器是通过某个类的.classLoader()方法,将该类的.class文件从硬盘中加载到java虚拟机中,形成字节码文件;
动态代理是为了实现目标类的功能,并添加特有的系统功能,传入类加载器,目标类的接口,以及InvocationHandler接口的实现子类,
(InvocationHandler接口的invoke()方法,要传入代理对象,方法名,方法的参数,在invoke方法中,可以添加特有的系统功能)
然后就可以根据运行时,目标类的不同,以及要实现系统功能的不同,动态生成代理类,来完成相应的功能类的创建;

热点内容
c与java编译过程 发布:2025-02-12 21:47:47 浏览:373
python的面向对象 发布:2025-02-12 21:46:10 浏览:613
医学影像存储解决方案 发布:2025-02-12 21:45:58 浏览:976
股票走势预测算法 发布:2025-02-12 21:45:06 浏览:769
游戏lua脚本 发布:2025-02-12 21:45:01 浏览:918
怎么下载安卓版的光子助手 发布:2025-02-12 21:43:45 浏览:454
oppor7s怎么取消锁屏密码 发布:2025-02-12 21:43:31 浏览:595
我的世界服务器甜蜜小镇 发布:2025-02-12 21:41:08 浏览:75
ftp影响数据交换 发布:2025-02-12 21:27:18 浏览:387
编译原理与实现pdf 发布:2025-02-12 21:27:14 浏览:42