`
outlaw
  • 浏览: 30666 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java ClassLoader深入研究(二)

阅读更多

五、关于两个ClassLoader载入同一个类

注意:由两个不同的ClassLoader载入的同一个类,其是不同类型的,因此如果进行赋值会报ClassCastException

示例:

 

  1. package Test;   
  2. import java.io.*;   
  3. import java.util.*;   
  4. public class TestClassLoader extends ClassLoader {   
  5.        
  6.     protected Map<String, Class> cache = new HashMap<String, Class>();   
  7.        
  8.     public TestClassLoader() {   
  9.         super();   
  10.     }   
  11.        
  12.     protected Class<?> findClass(String name) throws ClassNotFoundException {   
  13.         if (cache.get(name) != null) {   
  14.             return cache.get(name);   
  15.         }   
  16.         try {   
  17.             String tname = name.replace('.''/');   
  18.             File file = new File("c://" + tname + ".class");   
  19.             FileInputStream in = new FileInputStream(file);   
  20.             BufferedInputStream bufIn = new BufferedInputStream(in);   
  21.             ByteArrayOutputStream byteOut = new ByteArrayOutputStream();   
  22.             BufferedOutputStream bufOut = new BufferedOutputStream(byteOut);   
  23.             byte[] buffer = new byte[4096];   
  24.             int len = -1;   
  25.             while((len = bufIn.read(buffer)) != -1) {   
  26.                 bufOut.write(buffer, 0, len);   
  27.             }   
  28.             bufOut.flush();   
  29.             byteOut.flush();   
  30.             byte[] data = byteOut.toByteArray();   
  31.             Class cls = defineClass(name, data, 0, data.length);   
  32.             cache.put(name, cls);   
  33.             return cls;   
  34.         } catch (IOException e) {   
  35.             e.printStackTrace();   
  36.         }   
  37.         return null;   
  38.     }   
  39. }   
  40. class TestLoaderA {   
  41.     public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {   
  42.         TestClassLoader loader = new TestClassLoader();   
  43.         System.out.println(TestAImp1.class.getClassLoader());   
  44.         System.out.println(loader.findClass("Test.TestAImp1").getClassLoader());   
  45.         TestAImp1 test = (TestAImp1)loader.findClass("Test.TestAImp1").newInstance();   
  46.         test.test();   
  47.            
  48.     }   
  49. }   
  50. public class TestAImp1 extends AbstractTestA {   
  51.     public void test() {   
  52.         System.out.println(Thread.currentThread().toString());   
  53.         System.out.println("Test");   
  54.     }   
  55. }  

 

 运行以上代码结果:

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定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。...通过研究"InternalsOfClassloadingSrc"这样的项目,我们可以更深入地学习和实践ClassLoader的定制。

    classloader-playground, 一个简单的java依赖隔离容器类.zip

    总的来说,"classloader-playground"是一个实践和研究Java类加载机制的实用工具。通过这个项目,开发者不仅可以深入了解Java虚拟机的工作原理,还能掌握如何定制类加载器以满足特定场景的需求,提升系统的灵活性和可...

    ClassLoader 深入解析

    【ClassLoader 深入解析】 在Java编程语言中,ClassLoader是一个至关重要的组件,它负责加载类文件到Java虚拟机(JVM)中,使得程序能够运行。...对于Java开发者来说,深入研究ClassLoader是提升技能的重要一环。

    ClassLoader小例子

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得...通过深入研究"ClassLoader小例子",你可以更好地理解Java的类加载机制,并为自己的项目开发带来更多的灵活性。

    深入研究Java类加载机制 深入研究Java类加载机制

    ### 深入研究Java类加载机制 #### 一、Java类加载机制概述 Java类加载机制是Java程序运行的第一步,它对于理解Java虚拟机(JVM)的行为至关重要。类加载过程涉及到类的加载、链接(验证、准备、解析)、初始化等...

    classloader源码

    通过研究`ClassLoader`源码,我们可以更深入地理解Java的运行机制,这对于解决一些高级问题,如类冲突、模块化开发等具有重要价值。同时,自定义`ClassLoader`也是Java企业级应用、服务器插件框架以及动态部署场景中...

    ClassLoader的 一些测试

    1. 源码分析:研究ClassLoader的源码,了解其内部实现,特别是加载类的逻辑。 2. 类加载顺序:观察不同类加载器加载类的顺序,验证双亲委派模型。 3. 动态加载:创建自己的类加载器,尝试动态加载新的类,实现代码的...

    深入java虚拟机第二版

    通过深入研究JVM,开发者可以优化代码性能,解决内存泄漏、性能瓶颈等问题,提高软件的稳定性和效率。 书中详细讲解了JVM的生命周期管理,包括类加载机制,即如何从磁盘加载类到内存,以及类的加载、连接、初始化等...

    Tomcat研究之ClassLoader.pdf

    #### 二、Tomcat的ClassLoader体系结构 Tomcat采用了独特的类加载机制来处理不同的类库加载需求。其ClassLoader体系结构可以分为以下几个层次: 1. **Bootstrap ClassLoader**:这是JVM自带的类加载器,负责加载...

    Tomcat 5.0.18 ClassLoader source code insight

    总的来说,深入研究Tomcat 5.0.18的ClassLoader源码,不仅可以提升我们的技术水平,还能让我们更好地应对Java Web开发中的挑战。对于那些想要深入理解Java类加载机制和Tomcat内部工作的开发者,这是一个不可多得的...

    classloader-study.zip

    在Java编程语言中,`ClassLoader`是一个至关重要的组件,它负责加载类到...通过研究"**classloader-study.zip**"的内容,你将有机会提升对Java动态加载和卸载类的理解,这对于开发更高级的Java应用程序和框架至关重要。

    Java类热替换(热部署)源码

    在Java开发过程中,为了提高开发效率和调试便捷性,我们经常需要实现类的热替换...这个压缩包中的源码可能就是展示如何实现这个功能的一个实例,你可以仔细研究这些代码,加深对Java类加载机制和热替换技术的理解。

    java.lang研究

    《深入解析java.lang》 Java语言的核心库之一就是`java.lang`包,它包含了Java程序设计中最基础的类和接口,...通过深入研究`java.lang`,我们可以更好地理解Java的内在机制,并能更熟练地运用这些工具来解决问题。

    java写的java虚拟机

    在深入理解Java虚拟机的过程中,我们需要掌握以下几个关键知识点: 1. **字节码**:Java源代码编译后生成的中间表示,以`.class`文件形式存在,由JVM负责解释执行。 2. **类加载器**:负责加载类到JVM内存中,包括...

    classloader简单例子

    在理解了类加载器的工作原理后,我们可以通过标签"源码"来深入研究其实现细节。分析源码可以帮助我们更好地理解类加载器如何查找、加载和解析类。同时,"工具"标签可能暗示这个例子中还包含了一些辅助工具或技巧,...

    java rt包源代码

    在深入研究Java RT.jar源代码时,我们可以对Java的底层实现有更深入的理解,从而提升编程技能和解决问题的能力。 1. **基础类和接口**:Java RT包中包含了许多基础类,如`Object`、`String`、`Integer`、`...

    tomcat 类加载机制 —— ClassLoader

    《Tomcat类加载机制——ClassLoader详解》 在Java Web开发中,Tomcat作为最常用的Servlet容器,其类加载机制对于...通过阅读和研究Tomcat源码,我们可以更深入地了解这一机制,从而更好地驾驭这个强大的Web服务器。

Global site tag (gtag.js) - Google Analytics