五、关于两个ClassLoader载入同一个类
注意:由两个不同的ClassLoader载入的同一个类,其是不同类型的,因此如果进行赋值会报ClassCastException
示例:
- package Test;
-
import java.io.*;
-
import java.util.*;
-
public class TestClassLoader extends ClassLoader {
-
-
protected Map<String, Class> cache = new HashMap<String, Class>();
-
-
public TestClassLoader() {
-
super();
- }
-
-
protected Class<?> findClass(String name) throws ClassNotFoundException {
-
if (cache.get(name) != null) {
-
return cache.get(name);
- }
-
try {
-
String tname = name.replace('.', '/');
-
File file = new File("c://" + tname + ".class");
-
FileInputStream in = new FileInputStream(file);
-
BufferedInputStream bufIn = new BufferedInputStream(in);
-
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
-
BufferedOutputStream bufOut = new BufferedOutputStream(byteOut);
-
byte[] buffer = new byte[4096];
-
int len = -1;
-
while((len = bufIn.read(buffer)) != -1) {
-
bufOut.write(buffer, 0, len);
- }
- bufOut.flush();
- byteOut.flush();
-
byte[] data = byteOut.toByteArray();
-
Class cls = defineClass(name, data, 0, data.length);
- cache.put(name, cls);
-
return cls;
-
} catch (IOException e) {
- e.printStackTrace();
- }
-
return null;
- }
- }
-
class TestLoaderA {
-
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
-
TestClassLoader loader = new TestClassLoader();
-
System.out.println(TestAImp1.class.getClassLoader());
-
System.out.println(loader.findClass("Test.TestAImp1").getClassLoader());
-
TestAImp1 test = (TestAImp1)loader.findClass("Test.TestAImp1").newInstance();
- test.test();
-
- }
- }
-
public class TestAImp1 extends AbstractTestA {
-
public void test() {
- System.out.println(Thread.currentThread().toString());
-
System.out.println("Test");
- }
- }
运行以上代码结果:
sun.misc.Launcher$AppClassLoader@197d257
Test.TestClassLoader@1b90b39
Exception in thread "main" java.lang.ClassCastException: Test.TestAImp1
at Test.TestLoaderA.main(TestClassLoader.java:84)
分享到:
相关推荐
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。...通过研究"InternalsOfClassloadingSrc"这样的项目,我们可以更深入地学习和实践ClassLoader的定制。
总的来说,"classloader-playground"是一个实践和研究Java类加载机制的实用工具。通过这个项目,开发者不仅可以深入了解Java虚拟机的工作原理,还能掌握如何定制类加载器以满足特定场景的需求,提升系统的灵活性和可...
【ClassLoader 深入解析】 在Java编程语言中,ClassLoader是一个至关重要的组件,它负责加载类文件到Java虚拟机(JVM)中,使得程序能够运行。...对于Java开发者来说,深入研究ClassLoader是提升技能的重要一环。
在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得...通过深入研究"ClassLoader小例子",你可以更好地理解Java的类加载机制,并为自己的项目开发带来更多的灵活性。
### 深入研究Java类加载机制 #### 一、Java类加载机制概述 Java类加载机制是Java程序运行的第一步,它对于理解Java虚拟机(JVM)的行为至关重要。类加载过程涉及到类的加载、链接(验证、准备、解析)、初始化等...
通过研究`ClassLoader`源码,我们可以更深入地理解Java的运行机制,这对于解决一些高级问题,如类冲突、模块化开发等具有重要价值。同时,自定义`ClassLoader`也是Java企业级应用、服务器插件框架以及动态部署场景中...
1. 源码分析:研究ClassLoader的源码,了解其内部实现,特别是加载类的逻辑。 2. 类加载顺序:观察不同类加载器加载类的顺序,验证双亲委派模型。 3. 动态加载:创建自己的类加载器,尝试动态加载新的类,实现代码的...
通过深入研究JVM,开发者可以优化代码性能,解决内存泄漏、性能瓶颈等问题,提高软件的稳定性和效率。 书中详细讲解了JVM的生命周期管理,包括类加载机制,即如何从磁盘加载类到内存,以及类的加载、连接、初始化等...
#### 二、Tomcat的ClassLoader体系结构 Tomcat采用了独特的类加载机制来处理不同的类库加载需求。其ClassLoader体系结构可以分为以下几个层次: 1. **Bootstrap ClassLoader**:这是JVM自带的类加载器,负责加载...
总的来说,深入研究Tomcat 5.0.18的ClassLoader源码,不仅可以提升我们的技术水平,还能让我们更好地应对Java Web开发中的挑战。对于那些想要深入理解Java类加载机制和Tomcat内部工作的开发者,这是一个不可多得的...
在Java编程语言中,`ClassLoader`是一个至关重要的组件,它负责加载类到...通过研究"**classloader-study.zip**"的内容,你将有机会提升对Java动态加载和卸载类的理解,这对于开发更高级的Java应用程序和框架至关重要。
在Java开发过程中,为了提高开发效率和调试便捷性,我们经常需要实现类的热替换...这个压缩包中的源码可能就是展示如何实现这个功能的一个实例,你可以仔细研究这些代码,加深对Java类加载机制和热替换技术的理解。
《深入解析java.lang》 Java语言的核心库之一就是`java.lang`包,它包含了Java程序设计中最基础的类和接口,...通过深入研究`java.lang`,我们可以更好地理解Java的内在机制,并能更熟练地运用这些工具来解决问题。
在深入理解Java虚拟机的过程中,我们需要掌握以下几个关键知识点: 1. **字节码**:Java源代码编译后生成的中间表示,以`.class`文件形式存在,由JVM负责解释执行。 2. **类加载器**:负责加载类到JVM内存中,包括...
在理解了类加载器的工作原理后,我们可以通过标签"源码"来深入研究其实现细节。分析源码可以帮助我们更好地理解类加载器如何查找、加载和解析类。同时,"工具"标签可能暗示这个例子中还包含了一些辅助工具或技巧,...
在深入研究Java RT.jar源代码时,我们可以对Java的底层实现有更深入的理解,从而提升编程技能和解决问题的能力。 1. **基础类和接口**:Java RT包中包含了许多基础类,如`Object`、`String`、`Integer`、`...
《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于...通过阅读和研究Tomcat源码,我们可以更深入地了解这一机制,从而更好地驾驭这个强大的Web服务器。