一般的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文件载入内存而已。
分享到:
相关推荐
1. **自定义ClassLoader**:Java允许我们创建自定义的ClassLoader,这通常用于实现动态加载类的需求。自定义ClassLoader需要重写`findClass()`或`loadClass()`方法。`loadClass()`方法是类加载的入口,它会调用`find...
这篇博客“Java类动态加载(一)——java源文件动态编译为class文件”可能主要探讨了如何在运行时将Java源代码(.java)编译成对应的字节码文件(.class),并将其加载到Java虚拟机(JVM)中。以下是对这个主题的详细解析...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...
编译类加载器是一种特殊的类加载器,它在加载类之前会先对源代码进行编译。这种类型的类加载器对于那些需要在运行时动态生成或修改代码的应用场景非常有用。 #### 五、Java 2中的类加载器变化 Java 2平台引入了...
`DexFile`类提供了从.dex文件加载类的方法,例如`loadDex()`。一旦类加载到内存,就可以像使用普通类一样使用它们。 在实际应用中,动态加载dex文件通常伴随着一些挑战,比如权限问题、多版本兼容、类冲突等。例如...
双亲委派模型使得系统类(如java.*开头的类)由Bootstrap ClassLoader加载,而用户自定义类由应用程序类加载器(AppClassLoader)加载。这避免了类的冲突,保持了系统类库的稳定性。但有时我们可能需要打破这种模型...
这样,每次调用代理类中的方法,都会先检查实现类的class文件是否是最新的,如果不是则重新加载,达到动态加载实现类class的目的。 关键字: Java实现热加载; Java动态加载class; Java覆盖已加载的class; Java...
Java的ClassLoader类加载器机制 在 Java 虚拟机(JVM)中,类加载器(ClassLoader)扮演着非常重要的角色。类加载器负责加载 Java 类,包括核心类和用户自定义类。在 JVM 运行过程中,类加载器会形成一个层次结构,...
ClassLoader动态加载类 简单示例 包装tank.test; 导入java.util.Scanner; 导入tank.classloader.ClassLoaderManager; 导入tank.classloader.MyClassLoaderManager; 导入tank.classloader.SystemClassLoaderManager...
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对...
它们按照层次结构工作,遵循"委托模型",即从顶层的启动类加载器开始尝试加载类,如果找不到则逐级向下委托。 要实现动态加载jar文件,我们需要创建自定义的类加载器。这个类加载器需要继承`java.lang.ClassLoader`...
在Java中,类加载器负责查找并加载类到Java虚拟机中。我们可以通过自定义类加载器来实现热加载。例如,`MemoryClassLoader.java`可能就是一个自定义类加载器的实现,它可以在内存中动态加载或更新类。 **JarinJAR**...
Java ClassLoader是一个核心的Java运行时组件,负责加载类到Java虚拟机(JVM)中。它是Java平台的独特特性,因为它允许动态加载类,增强了软件的可扩展性和灵活性。这篇博文(虽然链接不可用)可能深入探讨了...
在Java编程语言中,动态加载类机制是一种强大的功能,它允许程序在运行时根据需要加载新的类或资源,而不是在编译时确定所有类。这种技术对于提高软件的灵活性、可扩展性和模块化至关重要,特别是在大型系统和插件式...
在该模型下,当一个ClassLoader收到加载类的请求时,它首先会委托父加载器去尝试加载,只有当父加载器无法加载时,当前加载器才会尝试自己加载。这样设计避免了类的重复加载,并确保了核心类库的唯一性。 四、...
在Java编程中,动态编译代码并热加载类是一项重要的技术,它允许程序在运行时修改或添加新的类,而无需重启应用。这种能力对于快速迭代开发、调试和性能优化非常有用。本主题将深入探讨Java中的动态编译与热加载机制...
ClassLoader 中的 loadClass 方法是加载类的核心方法,该方法首先检查该 name 指定的 class 是否有被加载,如果没有加载,则委托它的双亲 ClassLoader 进行加载,只有当双亲 ClassLoader 无法加载成功后,才会由自己...
Java 类加载器(ClassLoader)是Java虚拟机(JVM)的重要组成部分,它负责在运行时查找并加载类到JVM中。这个教程将深入探讨ClassLoader的工作原理、类型以及如何自定义类加载器。 一、Java ClassLoader 基础 1. 类...
Java虚拟机(JVM)有多个内置的类加载器,如Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader,它们按层次结构工作,依次加载类。用户还可以自定义类加载器以满足特定需求,例如加载网络上的类或加密...
为了确保动态加载的类与已加载的类之间能够正确地交互,Java虚拟机必须执行一系列的链接操作。这些操作包括验证类文件格式、准备类数据结构以及解析符号引用等。这些步骤确保了即使是在动态环境中加载的类也能保持...