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