java类加载器的一些测试
package classloader;
import java.lang.reflect.Method;
import org.junit.Test;
import com.example.Sample;
public class ClassIdentity {
public static void main(String[] args) {
// new ClassIdentity().testClassIdentity();
// System.out.println("执行了吗");
new ClassIdentity().testICalculator();
}
public void testICalculator(){
String basicClassName = "com.example.CalculatorBasic";
String advancedClassName = "com.example.CalculatorAdvanced";
String classDataRootPath = "C:\\";
FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath);
try {
Class<?> class1 = fscl1.loadClass(basicClassName);
//下面这句会导致fscl1尝试加载在C:\下面加载classloader.ICalculator
ICalculator calculator=(ICalculator)class1.newInstance();
System.out.println(calculator.getVersion());
System.out.println( ICalculator.class.getClassLoader());
System.out.println( calculator.getClass().getClassLoader());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void testClassIdentity() {
String classDataRootPath = "C:\\";
FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath);
FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath);
String className = "com.example.Sample";
try {
Class<?> class1 = fscl1.loadClass(className);
Object obj1 = class1.newInstance();
Class<?> class2 = fscl2.loadClass(className);
Object obj2 = class2.newInstance();
System.out.println("不同加载器->" + class1.equals(class2));
Class<?> c1= this.getClass().getClassLoader().loadClass("classloader.Versioned");
Class<?> c2= this.getClass().getClassLoader().loadClass("classloader.Versioned");
System.out.println("同一个->" + c1.equals(c2));
Method setSampleMethod = class1.getMethod("setSample", java.lang.Object.class);
// setSampleMethod.invoke(obj1, obj1);
// setSampleMethod.invoke(obj1, obj1);
System.out.println( Sample.class.getClassLoader());
System.out.println( ClassIdentity.class.getClassLoader());
System.out.println(obj1.getClass().getClassLoader() );
Sample sample=(Sample)obj1; //无法将obj1转化成Sample,引用的类加载器不同
} catch (Exception e) {
e.printStackTrace();
}
}
}
testICalculator()输出:
这里com.example.CalculatorBasic
这里classloader.ICalculator
这里java.lang.Object
1.0
sun.misc.Launcher$AppClassLoader@105d88a
classloader.FileSystemClassLoader@76fba0
改写类加载器
package classloader; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream; public class FileSystemClassLoader extends ClassLoader { private String rootDir; public FileSystemClassLoader(String rootDir) {
this.rootDir = rootDir;
} protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] classData = getClassData(name);
if (classData == null) {
throw new ClassNotFoundException();
}
else {
return defineClass(name, classData, 0, classData.length);
}
} private byte[] getClassData(String className) {
String path = classNameToPath(className);
try {
InputStream ins = new FileInputStream(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int bytesNumRead = 0;
while ((bytesNumRead = ins.read(buffer)) != -1) {
baos.write(buffer, 0, bytesNumRead);
}
return baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
} private String classNameToPath(String className) {
return rootDir + File.separatorChar
+ className.replace('.', File.separatorChar) + ".class";
} @Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{
System.out.println("这里" + name);
if("java.lang.Object".equals(name)
|| "classloader.ICalculator".equals(name)
){
return super.loadClass(name, resolve);
} return findClass(name);
} }
注释//Sample sample=(Sample)obj1; 后的输出:
这里com.example.Sample
这里java.lang.Object
这里com.example.Sample
这里java.lang.Object
不同加载器->false
同一个->true
sun.misc.Launcher$AppClassLoader@105d88a
sun.misc.Launcher$AppClassLoader@105d88a
classloader.FileSystemClassLoader@1866417
打开注释后的输出:
这里com.example.Sample
这里java.lang.Object
这里com.example.Sample
这里java.lang.Object
不同加载器->false
同一个->true
sun.misc.Launcher$AppClassLoader@105d88a
sun.misc.Launcher$AppClassLoader@105d88a
classloader.FileSystemClassLoader@1526e3
java.lang.ClassCastException: com.example.Sample cannot be cast to com.example.Sample
java类加载器的一些测试的更多相关文章
- 深入探讨 Java 类加载器
转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader)是 Java™中的一个很重要的概念.类 ...
- 深入探讨 Java 类加载器[转]
原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器(class loader)是 Java™ ...
- 转载:深入探讨 Java 类加载器
转载地址 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 深入探讨 Java 类加载器 类加载器(class loader) ...
- 全面解析Java类加载器
深入理解和探究Java类加载机制---- 1.java.lang.ClassLoader类介绍 java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字 ...
- Java类加载器学习笔记
今后一段时间会全面读一下<深入理解Java虚拟机> 在这里先记一下在网上看到的几篇介绍 类加载器 的文章,等读到虚拟机类加载机制再详细介绍. 超详细Java中的ClassLoader详解 ...
- Java基础-类加载机制与自定义类Java类加载器(ClassLoader)
Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...
- 深入理解Java类加载器(ClassLoader) (转)
转自: http://blog.csdn.net/javazejian/article/details/73413292 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Ja ...
- 深入探讨 Java 类加载器(转载)
类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式. ...
- java类加载器-----用户自定义类加载器实现
java类加载器主要分为如下几种: jvm提供的类加载器 根类加载器:底层实现,主要加载java核心类库(如:java.lang.*) 扩展类加载器:使用java代码实现,主要加载如:jre/lib/ ...
随机推荐
- 浅谈 Gevent 与 Tornado(转)
原文:http://www.pywave.com/2012/08/17/about-gevent-and-tornado/ 还是前几月的时候,几乎在同一时间,自己接触到了 Gevent 和 Torna ...
- 关于Eclipse中import javax.servlet.*出错
今天为了调试一下我写的Servlet,突然间,发现我的站点下所有的Servlet全部都出错了,仔细一看,原来是import javax.servlet.*这里出错了. 然后我就上网查阅了一些资料,才发 ...
- 开始SDK之旅-入门1基本环境搭建与测试
已验证这个可用. http://bbs.ccflow.org/showtopic-2560.aspx 集成方式已经用一段时间了,今天刚好有时间,尝试下SDK.使用的话,也很方便,以下是简单的步骤1.新 ...
- node.js + express 初体验【hello world】
[node.js] 一个神奇的XX 呵呵 :) 不知道怎么形容他才好! [express] 是node.js 开发web应用程序的框架 开发环境:XP 大家共同进步吧 :) 一:前期准备: 1:下载 ...
- 黄聪:360浏览器、chrome开发扩展插件教程(3)关于本地存储数据
转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html HTML5中的localStorage localStorage与 ...
- 【转】Java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- bootstrap全局css样式
以下从官网抄来的,感觉还是很实用的,运用得好,灵活运用,非常方便快捷,能大大提高开发效率,也为调整不同尺寸的屏幕节省了时间. hidden-xs @media (max-width: 767px){ ...
- 深入浅出spring IOC中三种依赖注入方式
深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...
- JavaScript常见集合操作
JavaScript常见集合操作 集合的遍历 FOR循环(效率最高) 优点:JavaScript最普遍的for循环,执行效率最高 缺点:无法遍历对象 for(let i=0;i<array.le ...
- multipart/form-data boundary 说明
含义 ENCTYPE="multipart/form-data" 说明: 通过 http 协议上传文件 rfc1867协议概述,jsp 应用举例,客户端发送内容构造 1.概述在最初 ...