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());
用URLClassLoader来简化
       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文件(含代码)相关推荐

  1. JBoss 系列十四:JBoss7/WildFly如何加载外部的文件或properties文件

    http://www.tuicool.com/articles/M7ZR3y 原文 http://blog.csdn.net/kylinsoong/article/details/12623997 主 ...

  2. jboss加载外部的文件

    内容概述 JBoss7/WildFly设底层框架一大亮点的Module class loading,及每一个相对独立的模块看作一个Module,每个Module都有自己的class loader,Mo ...

  3. ajax如何请求json文件,简单的ajax请求加载外部json文件

    我在学习ajax ....我试图从json文件发出一个基本请求,它与我的index.html位于同一个文件夹中,但由于某种原因它说未定义:(我可以看到错误是可变的人,但我不能赶上为什么它未定义.... ...

  4. Spark动态加载外部资源文件

    Spark动态加载外部资源文件 1.spark-submit --files 动态加载外部资源文件 之前做一个关于Spark的项目时,因项目中需要读取某个静态资源文件,然后在本地IDEA测试一切皆正常 ...

  5. spark-submit --files 动态加载外部资源文件

    在做spark时,有些时候需要加载资源文件,需要在driver或者worker端访问.在client模式下可以使用IO流直接读取,但是在cluster模式下却不能直接读取,需要如下代码: val is ...

  6. flex加载外部swf文件[flex-swf and flash as3 swf],并且互相通讯-加强原来的帖

    第一步:建立加载类[CtmObjLoader],此类可以加载文件类型 [图片文件或swf文件] package { import flash.display.DisplayObject;  impor ...

  7. Flash:关键帧中调用自建的音乐类,进行播放、关闭、循环音乐+按键播放或者关闭外部音乐+循环播放背景音乐+播放按钮音乐+停止+加载外部音乐文件+AS2播放背景音乐

    目录 一.关键帧里面:调用自建的音乐类, 循环播放外部音乐.进行播放.关闭.循环音乐 1.代码:自建音乐类 2.关键帧中创建.播放.暂停背景音乐+按钮音乐 3.文件布置 二.关键帧中:按键播放或者关闭 ...

  8. 【Java类加载机制】深入加载器

    加载的全过程,分为三步:加载.链接(验证.准备.解析).初始化.(使用.卸载) 加载 字节码的来源: 硬盘上的class文件 网络上的字节码(服务器.其他程序发来的) jar包.zip文件 数据库中的 ...

  9. QLibrary 动态加载外部库文件

    /*转载请注明出处,谢谢*/ 背景:想搭一个软件系统,包含一个主模块,一堆子模块(用于扩展功能).主模块是一个可执行程序,子模块为动态库,可以加载在主模块中. 问题:每添加一个扩展功能就要修改一下主模 ...

最新文章

  1. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
  2. 16Adapter(适配器)模式
  3. 启动jar包 服务方式
  4. Apache实现一个ip(如:127.0.0.1)和多个域名(虚拟主机)绑定
  5. java hotspot 是什么_什么是HotSpot
  6. java 类.class_面试官:Java反射是什么?我回答不上来!
  7. feign消费时,如果传入参数过长,会导致feign.FeignException: status 400 reading错误
  8. android label关闭按钮,iOS弹出关闭按钮标签:“OK”还是“Okay”?
  9. win10 休眠设置无效_睡眠模式在Windows 10系统上不起作用?
  10. paip.软件及网站项目开发效率低下的思索与改进
  11. Premiere Pro CC2017软件安装资料及教程
  12. matlab中使用xlsread导入excel数据
  13. python爬虫——30行代码爬取论坛数据
  14. 给Office文档加密方式与原理揭秘
  15. UML 图中 包含关系和扩展关系的联系和区别
  16. python中交集并集用什么符号表示_Python实现两个list求交集,并集,差集的方法示例...
  17. android 动画 最顶层_【尼康影像学院】使用SnapBridge连接照相机与智能手机(Android安卓系统)...
  18. 未来杯区域赛奖项争夺进入倒计时,专家评审团阵容揭晓
  19. MySQL解决幻读详解
  20. python 优雅的写法_优雅的python写法

热门文章

  1. [转载]VBS入门教程 VBS基础教程
  2. 山东大学暑期项目实训-基于信用评分卡算法模型的个人信用评级系统的设计与实现-第二周-6(7月9日
  3. kafka源码_十年资深架构师多年工作经验结晶:Kafka源码解析与实战
  4. bat脚本输入密码_Mysql修改密码20190511
  5. R关于一些字符串报错
  6. vue:extend和mixin的区别
  7. 统计分析——相关分析
  8. 316页11万字AI赋能智慧水利大数据信息化平台建设和运营解决方案
  9. 人老了,到底是应该多运动还是多静养?跳广场舞要注意啥?
  10. emacs编译器操作指令