java ClassLoader机制和如何加载外部class文件(含代码)
Java类的生命周期
生命周期有:加载(Loading)--》验证(Verification)--》准备(Preparation)---》解析(Resolution)--》初始化(Initiation)---》使用(Using)----》卸载(Unloading)。 其中标黄的验证---》准备---》解析被称为连接(Linking)。
就代码执行而言:
1.连接阶段:不执行程序员代码
2.加载阶段:可以重写ClassLoader来执行我们的代码
3.连接后阶段:执行该类的代码
ClassLoader:
ClassLoader是为了将class文件的byte数组,主要的方法是findClass用于查找类。
Java7有个迅速将File变成byte[]的方法:
byte[] cLassBytes = null;Path path;try {path = Paths.get(new URI("file:///D:/MyScript/TestClassLoader.class"));cLassBytes = Files.readAllBytes(path);
每个ClassLoader对象都有一个ClassLoader类型的字段,暂且成为parent。当调用本类的loadClass方法加载类时,会先调用parent的ClassLoader,如果他没找到,才会调用本类的findClass方法去查找类。(这样,应用的Launcher$AppClassLoader也可以通过BootStrapClassLoader来调用String类了)。
查找类的顺序,与对应的ClassLoader
系统查找类的顺序是:
1).Bootstrap classes: the runtime classes in rt.jar, internationalization classes in i18n.jar, and others.
2).Installed extensions: classes in JAR files in the lib/ext directory of the JRE, and in the system-wide, platform-specific extension directory (such as /usr/jdk/packages/lib/ext on the Solaris™ Operating System, but note that use of this directory applies only to Java™ 6 and later).
3).The class path: classes, including classes in JAR files, on paths specified by the system property java.class.path. If a JAR file on the class path has a manifest with the Class-Path
attribute, JAR files specified by the Class-Path
attribute will be searched also. By default, thejava.class.path
property's value is .
, the current directory. You can change the value by using the -classpath or -cp command-line options, or setting the CLASSPATH
environment variable. The command-line options override the setting of the CLASSPATH
environment variable.
中文就是:
1)rt.jar等(这个jar是什么呢?你用java -verbose 类名 运行下就看到了:Loaded java.io.File from C:\Program Files\Java\jre1.8.0_31\lib\rt.jar,也就是经常调用的String、Long等类,属于SDK中的)(用BootStrapClassLoader加载)
2) SDK中的拓展类,包名为javax的(java和javax都是Java的API(Application Programming Interface)包,java是核心包,javax的x是extension的意思);
(用Launcher$ExtClassLoader加载)
3) 系统环境变量CLASSPATH的路径,当前目录(或者用命令行带 -classpath重新)
(用Launcher$AppClassLoader加载)
可是我的类文件在D:\MyScript\TestClassLoader.class不在上述三种。
2:解决方案
1.场景:我想加载一个d盘上的类,路径是:D:\MyScript\TestClassLoader.class,其不在上述三种情况。
通过重写一个ClassLoader进行加载,不过有现成的URLClassLoader我们就不要重造轮子了。
自定义ClassLoader代码
public class MyClassLoader extends ClassLoader{@Overrideprotected Class<?> findClass(String className)throws ClassNotFoundException {byte[] cLassBytes = null;//Java 7有下列APItry {path = Paths.get(new URI("file:///D:/MyScript/TestClassLoader.class"));cLassBytes = Files.readAllBytes(path);} catch (IOException | URISyntaxException e) {e.printStackTrace();}Class cLass = defineClass(cLassBytes, 0, cLassBytes.length);return cLass;}
}
使用的时候:
Class.forName("TestClassLoader", true, new MyClassLoader());
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();// This URL for a directory will be searched *recursively*URL classes;try {classes = new URL( "file:///D:/MyScript/" );ClassLoader custom = new URLClassLoader( new URL[] { classes }, systemClassLoader );// this class should be loaded from your directoryClass< ? > clazz = custom.loadClass( "TestClassLoader" ); Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {System.out.println(method.getName());}
URLClassLoader用的URL只能接受目录和jar包:
结尾: /代表该目录下的来; 非/而是文件则默认为jar包。
贴一个jar包的代码:
public URL findResource(String name) {
try {
File file = new File(jarFile);
String url = file.toURL().toString();
return new URL("jar:"+url+"!/"+name);
} catch (Exception e) {
return null;
}}
另外我用反射来验证类是否加载成功了,clazz.newInstance()也可以生成相关代码。
java ClassLoader机制和如何加载外部class文件(含代码)相关推荐
- JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件
http://www.tuicool.com/articles/M7ZR3y 原文 http://blog.csdn.net/kylinsoong/article/details/12623997 主 ...
- jboss加载外部的文件
内容概述 JBoss7/WildFly设底层框架一大亮点的Module class loading,及每一个相对独立的模块看作一个Module,每个Module都有自己的class loader,Mo ...
- ajax如何请求json文件,简单的ajax请求加载外部json文件
我在学习ajax ....我试图从json文件发出一个基本请求,它与我的index.html位于同一个文件夹中,但由于某种原因它说未定义:(我可以看到错误是可变的人,但我不能赶上为什么它未定义.... ...
- Spark动态加载外部资源文件
Spark动态加载外部资源文件 1.spark-submit --files 动态加载外部资源文件 之前做一个关于Spark的项目时,因项目中需要读取某个静态资源文件,然后在本地IDEA测试一切皆正常 ...
- spark-submit --files 动态加载外部资源文件
在做spark时,有些时候需要加载资源文件,需要在driver或者worker端访问.在client模式下可以使用IO流直接读取,但是在cluster模式下却不能直接读取,需要如下代码: val is ...
- flex加载外部swf文件[flex-swf and flash as3 swf],并且互相通讯-加强原来的帖
第一步:建立加载类[CtmObjLoader],此类可以加载文件类型 [图片文件或swf文件] package { import flash.display.DisplayObject; impor ...
- Flash:关键帧中调用自建的音乐类,进行播放、关闭、循环音乐+按键播放或者关闭外部音乐+循环播放背景音乐+播放按钮音乐+停止+加载外部音乐文件+AS2播放背景音乐
目录 一.关键帧里面:调用自建的音乐类, 循环播放外部音乐.进行播放.关闭.循环音乐 1.代码:自建音乐类 2.关键帧中创建.播放.暂停背景音乐+按钮音乐 3.文件布置 二.关键帧中:按键播放或者关闭 ...
- 【Java类加载机制】深入加载器
加载的全过程,分为三步:加载.链接(验证.准备.解析).初始化.(使用.卸载) 加载 字节码的来源: 硬盘上的class文件 网络上的字节码(服务器.其他程序发来的) jar包.zip文件 数据库中的 ...
- QLibrary 动态加载外部库文件
/*转载请注明出处,谢谢*/ 背景:想搭一个软件系统,包含一个主模块,一堆子模块(用于扩展功能).主模块是一个可执行程序,子模块为动态库,可以加载在主模块中. 问题:每添加一个扩展功能就要修改一下主模 ...
最新文章
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
- 16Adapter(适配器)模式
- 启动jar包 服务方式
- Apache实现一个ip(如:127.0.0.1)和多个域名(虚拟主机)绑定
- java hotspot 是什么_什么是HotSpot
- java 类.class_面试官:Java反射是什么?我回答不上来!
- feign消费时,如果传入参数过长,会导致feign.FeignException: status 400 reading错误
- android label关闭按钮,iOS弹出关闭按钮标签:“OK”还是“Okay”?
- win10 休眠设置无效_睡眠模式在Windows 10系统上不起作用?
- paip.软件及网站项目开发效率低下的思索与改进
- Premiere Pro CC2017软件安装资料及教程
- matlab中使用xlsread导入excel数据
- python爬虫——30行代码爬取论坛数据
- 给Office文档加密方式与原理揭秘
- UML 图中 包含关系和扩展关系的联系和区别
- python中交集并集用什么符号表示_Python实现两个list求交集,并集,差集的方法示例...
- android 动画 最顶层_【尼康影像学院】使用SnapBridge连接照相机与智能手机(Android安卓系统)...
- 未来杯区域赛奖项争夺进入倒计时,专家评审团阵容揭晓
- MySQL解决幻读详解
- python 优雅的写法_优雅的python写法