昨天写了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(类加载器)是至关重要的组件,它负责查找并加载Java类到Dalvik或ART运行时环境。这个测试demo是为了帮助开发者深入理解Android中两种主要的类加载器:DexClassLoader和...
以下是一个简单的测试代码示例,用于展示如何获取当前运行环境中的类加载器以及它们之间的层次关系。 ```java public class LoaderSample1 { public static void main(String[] args) { Class c; ClassLoader cl...
总之,这个名为“测试普通Java程序ClassLoader等级关系的Demo程序”旨在帮助开发者掌握Java中类加载器的工作原理和它们之间的层次关系,这对于理解Java应用程序的运行机制和进行问题排查具有非常实际的意义。...
在这个"web_classloader_test.zip_web classloader"示例中,我们可能涉及到了一些关于Web应用中类加载机制的核心概念。下面将详细探讨这些知识点。 1. **双亲委派模型**:这是Java类加载器的基础模型,它规定了类...
在"my_classloader"文件中,可能包含了这个类加载器的源代码、测试用例或其他相关资源。分析这些文件可以帮助我们更好地理解C++类加载器的具体实现细节,包括它是如何处理类的加载、解析和实例化的。 总之,类加载...
《深入理解ClassLoader》 在Java世界中,ClassLoader是运行时加载类的核心机制,它负责将类的.class文件加载到JVM中,使得程序能够运行。本文将深入剖析ClassLoader的工作原理,以及其在实际开发中的应用。 一、...
下面通过一个小例子测试这三个JVM自带的ClassLoader之间的关系: ```java public class ClassLoaderTest1 { public static void main(String[] args) { ClassLoader loader = ClassLoaderTest1.class....
【标题】"restx-classloader-0.33.1.zip" 提供的是 Restx ClassLoader 的一个版本,这是 Restx 框架的一部分,主要负责处理类加载相关的任务。Restx 是一个轻量级、模块化的 Java web 应用框架,它允许开发者快速...
这种能力对于开发环境特别有用,因为它允许开发者在不重启应用的情况下测试和调试代码,显著提高了开发效率。 ### Java 2中的类加载器变化 Java 2(J2SE 1.2)对类加载器进行了重大改进,引入了双亲委派模型...
`ClassLoaderDemo`示例可能包含编写自定义类加载器的代码,以及使用这些加载器加载特定类的测试用例。通过分析和运行这个示例,我们可以深入理解类加载的整个流程,包括类的查找、加载、链接和初始化等步骤。 总之...
4. **工具支持**:有一些工具,如Spring Boot的DevTools、JRebel等,提供了热部署功能。它们通过监听文件系统变化,一旦检测到源代码有更新,就自动重新编译并利用自定义类加载器加载新版本的类。 在提供的文件列表...
工程名为service_classloader,功能全部使用corejava实现,使用maven管理依赖,没有使用任何框架(junit除外)。 使用的技术主要包括:classlaoder,加密解密,线程,ThreadLocal使用,反射,IO操作,jdbc, 序列化,...
本示例项目"my_classloader_demo-master.7z"聚焦于通过Native层实现热修复,这涉及到Android系统的核心组件以及对Java虚拟机(JVM)的深入理解。 1. **类加载器(ClassLoader)**: 在Java编程中,类加载器是负责将类...
然而,在实际测试中,不使用DelegateClassLoader时,应用启动速度明显提高,这表明自定义ClassLoader的引入增加了启动时间。 为了找出原因,开发者进行了详细的性能测试。结果显示,即使DelegateClassLoader不做...
在生产环境中使用时,应当谨慎评估风险,并确保充分测试。同时,随着Maven版本的更新,官方可能会引入新的类加载解决方案,因此持续关注Maven的最新动态也是十分必要的。 总之,"Maven-classloader-plugin"是一个...
在Java编程中,类加载器(ClassLoader)是一个关键组件,负责加载类到JVM(Java虚拟机)中。`ClassLoaderTest`是一个特定的测试用例,专注于如何有效地管理和关闭类加载器,以防止资源泄漏,特别是针对加载了基础jar...
5. **类加载器(System.classLoader())**:在某些测试场景下,可能需要模拟不同的类加载行为。System Lambda 提供了对类加载器的控制,方便进行这种模拟。 在实际使用中,开发人员可以通过引入 System Lambda 库,...
2. 测试用例:用于演示如何使用这个自定义类加载器进行类的重新加载。 3. 阅读材料:可能包含关于类加载器原理的详细解释和示例的背景信息。 为了理解并实现这个示例,你需要熟悉Java编程,特别是类加载器的概念,...