一般的class都是由系统类加载器、或者其父加载器或者bootstartup加载器加载的,但在应用中可以指定类的加载器,然后将生成的class对象造型为具体的类。
public class LoadClass {
public static void main(String args[]) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException{
URL url=new URL("file:/G:/test/");
URLClassLoader loader=new URLClassLoader(new URL[]{url});
Class c=loader.loadClass("LoadModel");
Object o=c.newInstance();
Comparable comparable=(Comparable)o;
System.out.println("result:"+comparable.compareTo(""));
}
}
class LoadModel implements Comparable{
public int compareTo(Object o){
return 33;
}
}
以上的LoadModel类的class文件放置在G:/test/目录中(必须把LoadModel.java编译成class文件),而LoadClass.java放置在其他文件夹(避免通一个classpath,否则使用loader动态装载就没效用了).以上代码执行时可以获取结果。
注意:不同的加载器即使加载的是同一个类,在jvm看来他们也是不同的类,不能进行转换。例如上面例子使用一个新的URLClassLoader动态加载了一个LoadModel实例(先使用newInstance()方法生成一个Object对象,其实该对象的类型是LoadModel),假设LoadModel在当前的类路径,即在G:/test/下有LoadModel.java文件,当使用LoadModel m=(LoadModel)o 进行强制转换时会出现ClassCastException异常,原因就是这两个LoadModel类型不在同一个ClassLoader中。要想使程序能运行,则须设定LoadModel基础一个当前类路径上的类或实现当前类路径上的一个接口,然后转换类型的时候把该类强制转换为其父类或其实现的接口就可以了,如上例(假如继承的类或实现的接口不是核心API里面的,那还必须在该类的classpath中定义该类的父类或其实现的接口),之所以可以这样是因为该类实现的接口或者继承的父类都是由同一个类加载器加载的(系统类加载器)。
以上所说的可以概况为,两个类进行转换的的必要条件是他们都是由同一个类加载器加载,当我们的目标类实现了java核心API中的接口或者继承了核心API的类时,因为继承的接口和类只能在系统类加载器或扩展加载器又或者是bootstartup类加载器之一加载。我们的测试类肯定是由这三者之一加载了,根据类加载的全盘负责原则,测试类中的所有类也由测试类的加载器加载(除非显式的使用类加载器加载),这样可以确定了在测试类中出现的目标类接口(或者父类)是由系统加载器加载;另外我们测试类中显式的使用类加载器加载的目标类是由我们自定义的类加载器加载,而在目标类出现的目标类接口(或父类)也由我们自定义的类加载器加载,但根据类加载原则,自定义加载器会委托父加载器加载目标接口,这样,目标接口(或父类)就变成了使用系统类加载器加载了,这样测试类的目标接口(父类)与目标类所在文件的目标接口(父类)都由系统类加载器加载,从而他们也就可以相互转换了。
另外必须把LoadModel.java编译成class文件的原因是,javac命令只能编译当前类路径的java文件,而LoadModel.java并不在当前classpath中。ClassLoader中的loadClass方法并不能编译java文件为class文件,它只是将.class文件载入内存而已。
分享到:
相关推荐
ClassLoader类加载器讲解,理解JAVA类加载机制
这样,每次调用代理类中的方法,都会先检查实现类的class文件是否是最新的,如果不是则重新加载,达到动态加载实现类class的目的。 关键字: Java实现热加载; Java动态加载class; Java覆盖已加载的class; Java...
ClassLoader动态加载类 简单示例 包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager...
【图解版】深入分析ClassLoader类加载工作机制,从原理到JVM的装载过程,详情分析了ClassLoader加载类以及自定义类加载器的过程,不可用于商业用途,如有版权问题,请联系删除!
它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。现在类加载器在 ...
本篇文章主要给大家讲述了Java中ClassLoader类加载的原理以及用法总结,一起学习下。
ClassLoader的API使用和自定义
jvm运行的过程中,需要载入类,而类的加载需要类加载器,本文章提供了java的类加载器的工作原理。可以使读者更加理解jvm的运行机制。
java自定义类加载classloader文档,包括代码,以及详细的原理及过程
下面小编就为大家带来一篇classloader类加载器_基于java类的加载方式详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java应用程序类加载器(ClassLoader for java Application),类似exe4j, 方便启动java程序, 配置灵活,支持多平台选择性配置
ClassLoader类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。从而只有class文件被载入到了内存之后,才能被其程序所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。 ...
1.java classloader 的概述 2.java classloader 的分类 3.自定义 java classloader
Java_ClassLoader详解,解说java类的加载的原理,让你轻松了解java的类加载
java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class... 一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL
主要内容包括 Java类加载机制及加载流程,以及如何定义自己的类加载器,如何实现类的热替换。
详细介绍java中的类加载器的使用,以及在在使用过程中需要注意的知识点
它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。现在类加载器在 ...
Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射
如果户创建的JAR放在此录下,也会动由扩展类加载器加载.应程序类加载器(系统类加载器,Application ClassLoader)java语编写,由sun.