`

ClassLoader的 一些测试

阅读更多

昨天写了ClassLoader原理的东西,今天对ClassLaoder做了一下测试

 

package com.fnk.classloader;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

import com.fnk.TestClass;

public class MultyClassLoader  {
	public static void main(String[] args) {
		FileClassLoader classLoader1 = new FileClassLoader(
				"./");
		FileClassLoader classLoader2 = new FileClassLoader(
		"./");

		try {
			/*
			 *在同一个类加载器中加载了类com.fnk.classloader.TestClass和com.fnk.TestClass。虽然类名
			 *相同,但是不同的包下面所以可以加载。但如果加载同包同类名就会抛出重复加载的错误。
			 */
			Class c1 = classLoader1.loadClass("com.fnk.classloader.TestClass");
			classLoader1.setDirectory("./src/");
			Class c11 = classLoader1.findClass("com.fnk.TestClass");
		 
			/*
			 * TestClass是定义在class path下面的类,虽然类名也是com.fnk.TestClass。但是因为TestClass是App classloader
			 * 加载的,而c11是classLoader1加载的。这样将c11实例化的对象的引用赋值给TestClass时就抛出ClassCastException异常
			 */
			TestClass tc = (TestClass)c11.newInstance();
			tc.test();
			
			/*
			 * 不同的classLoader中可以加载同包同类名的类。而且会被认为是不同的类。
			 * 如下面当我调用tc1.equals(tc2)时返回了false,如下我重载了equals方法。
			 * public boolean equals(Object obj) {
		     *  // TODO Auto-generated method stub
		     *   if(obj instanceof TestClass)
		     *    return true;
		     *   else
			 *    return super.equals(obj);
	         *  }
	         *  我们可以让TestClass类实现Testf接口,那样就将TestClass对象赋值给Testf接口,然后调用方法
			 */
			Class c2 = classLoader2.loadClass("com.fnk.classloader.TestClass");
			Testf tc1 = (Testf)c1.newInstance();
			Testf tc2 = (Testf)c2.newInstance();
			tc1.test();
			tc2.test();
		 
			if(tc1.equals(tc2)){
				System.out.println("true");
			}else{
				System.out.println("false");
			}
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
 
分享到:
评论

相关推荐

    Android Classloader测试demo

    在Android系统中,Classloader(类加载器)是至关重要的组件,它负责查找并加载Java类到Dalvik或ART运行时环境。这个测试demo是为了帮助开发者深入理解Android中两种主要的类加载器:DexClassLoader和...

    测试普通Java程序ClassLoader等级关系的Demo程序

    总之,这个名为“测试普通Java程序ClassLoader等级关系的Demo程序”旨在帮助开发者掌握Java中类加载器的工作原理和它们之间的层次关系,这对于理解Java应用程序的运行机制和进行问题排查具有非常实际的意义。...

    web_classloader_test.zip_web classloader

    在这个"web_classloader_test.zip_web classloader"示例中,我们可能涉及到了一些关于Web应用中类加载机制的核心概念。下面将详细探讨这些知识点。 1. **双亲委派模型**:这是Java类加载器的基础模型,它规定了类...

    classloader的简单实现

    在"my_classloader"文件中,可能包含了这个类加载器的源代码、测试用例或其他相关资源。分析这些文件可以帮助我们更好地理解C++类加载器的具体实现细节,包括它是如何处理类的加载、解析和实例化的。 总之,类加载...

    浅析ClassLoader

    《深入理解ClassLoader》 在Java世界中,ClassLoader是运行时加载类的核心机制,它负责将类的.class文件加载到JVM中,使得程序能够运行。本文将深入剖析ClassLoader的工作原理,以及其在实际开发中的应用。 一、...

    ClassLoader in OSGI

    下面通过一个小例子测试这三个JVM自带的ClassLoader之间的关系: ```java public class ClassLoaderTest1 { public static void main(String[] args) { ClassLoader loader = ClassLoaderTest1.class....

    restx-classloader-0.33.1.zip

    【标题】"restx-classloader-0.33.1.zip" 提供的是 Restx ClassLoader 的一个版本,这是 Restx 框架的一部分,主要负责处理类加载相关的任务。Restx 是一个轻量级、模块化的 Java web 应用框架,它允许开发者快速...

    Understanding the Java ClassLoader.pdf

    这种能力对于开发环境特别有用,因为它允许开发者在不重启应用的情况下测试和调试代码,显著提高了开发效率。 ### Java 2中的类加载器变化 Java 2(J2SE 1.2)对类加载器进行了重大改进,引入了双亲委派模型...

    ClassLoaderDemo.7z

    `ClassLoaderDemo`示例可能包含编写自定义类加载器的代码,以及使用这些加载器加载特定类的测试用例。通过分析和运行这个示例,我们可以深入理解类加载的整个流程,包括类的查找、加载、链接和初始化等步骤。 总之...

    classloader 热部署

    4. **工具支持**:有一些工具,如Spring Boot的DevTools、JRebel等,提供了热部署功能。它们通过监听文件系统变化,一旦检测到源代码有更新,就自动重新编译并利用自定义类加载器加载新版本的类。 在提供的文件列表...

    service_classloader

    工程名为service_classloader,功能全部使用corejava实现,使用maven管理依赖,没有使用任何框架(junit除外)。 使用的技术主要包括:classlaoder,加密解密,线程,ThreadLocal使用,反射,IO操作,jdbc, 序列化,...

    my_classloader_demo-master.7z Native层实现热修复

    本示例项目"my_classloader_demo-master.7z"聚焦于通过Native层实现热修复,这涉及到Android系统的核心组件以及对Java虚拟机(JVM)的深入理解。 1. **类加载器(ClassLoader)**: 在Java编程中,类加载器是负责将类...

    关于Android中自定义ClassLoader耗时问题的追查

    然而,在实际测试中,不使用DelegateClassLoader时,应用启动速度明显提高,这表明自定义ClassLoader的引入增加了启动时间。 为了找出原因,开发者进行了详细的性能测试。结果显示,即使DelegateClassLoader不做...

    maven-classloader-plugin:只是针对Maven插件中的类加载问题的实验

    在生产环境中使用时,应当谨慎评估风险,并确保充分测试。同时,随着Maven版本的更新,官方可能会引入新的类加载解决方案,因此持续关注Maven的最新动态也是十分必要的。 总之,"Maven-classloader-plugin"是一个...

    ClassLoaderTest:测试如何正确关闭类加载器,以便可以关闭基础jar文件上的文件句柄

    在Java编程中,类加载器(ClassLoader)是一个关键组件,负责加载类到JVM(Java虚拟机)中。`ClassLoaderTest`是一个特定的测试用例,专注于如何有效地管理和关闭类加载器,以防止资源泄漏,特别是针对加载了基础jar...

    System Lambda是一个函数集合,用于测试使用javalangSystem的代码.zip

    5. **类加载器(System.classLoader())**:在某些测试场景下,可能需要模拟不同的类加载行为。System Lambda 提供了对类加载器的控制,方便进行这种模拟。 在实际使用中,开发人员可以通过引入 System Lambda 库,...

    FakeClassloader:替换classloader,完成全局代理,可代理接口、private方法、final方法及final类

    在Java编程语言中,`ClassLoader`是一个至关重要的组件,它负责加载类到JVM(Java虚拟机)中。`FakeClassloader`是一个特殊设计的类加载器,它允许开发者进行全局代理,覆盖常规的类加载行为,使得我们可以对类、...

Global site tag (gtag.js) - Google Analytics