由不同ClassLoader加载的同名类属于不同类
来源:互联网 发布:阿里云服务器怎么换ip 编辑:程序博客网 时间:2024/05/16 14:28
由不同ClassLoader加载的同名类属于不同的类型,不能相互转化和兼容。
新建一个工程NotSameClass。将如下代码,一份放入NoSameClass工程源代码目录下,一份编译成.class放入D:\temp目录下
运行如下代码,使用不同的类加载器加载同一个类(源代码都一样,不过一个来自bin目下的.class,一个来自D:\temp下的.class)
Java Code
package com.bjsxt.test;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
//先用应用类加载器加载HelloLoader
HelloLoader object1=new HelloLoader();
System.out.println(object1.getClass().getClassLoader());
//再用扩展类加载器加载HelloLoader
ClassLoader cl = ClassLoader.getSystemClassLoader();
try {
byte[] classBytes = loadClassBytes("com.bjsxt.test.HelloLoader");
Method defineClassMethod = ClassLoader.class.getDeclaredMethod("defineClass", byte[].class, int.class, int.class);
defineClassMethod.setAccessible(true);
defineClassMethod.invoke(cl.getParent(), classBytes, 0, classBytes.length);
Class<?> clazz = cl.getParent().loadClass("com.bjsxt.test.HelloLoader");
System.out.println(clazz.getClassLoader());
//两个不同类的对象强制类型转换
object1=(HelloLoader)clazz.newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
/**
* 将包名中的.替换成路径分隔符,从D:/temp/目录下查找这个文件,如果存在的话,将其读取到字节数组
* @param name
* @return
*/
public static byte[] loadClassBytes(java.lang.String name) {
String path="D:/temp/"+name.replace(".", "/")+".class";
InputStream is=null;
ByteArrayOutputStream baos=null;
try {
is=new FileInputStream(path);
baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int ret=0;
while((ret=is.read(buffer))!=-1){
baos.write(buffer, 0, ret);
}
return baos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(is!=null)
is.close();
if(baos!=null)
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
并且,即便是同一类 类加载器,不同的对象加载出来的类也不是同一个类。
- 由不同ClassLoader加载的同名类属于不同类
- ClassLoader:由不同的类加载器实例加载,那么它们的类型是不相同的
- C++不同类中的特征标相同的同名函数
- 利用classloader动态选择不同类执行
- 封装不同类的不同名称的方法
- Log4j2 示例 不同类log到不同的文件
- JAVA 不同类加载器命名空间的理解
- Java类加载机制——如何实现一个工程中不同模块加载不同版本的同名jar包。
- Java类加载机制——如何实现一个工程中不同模块加载不同版本的同名jar包。
- ClassLoader 加载类的顺序
- ClassLoader与类的加载
- log4j学习(二)不同类的日志输出到不同的文件
- 详解ClassLoader加载类的流程及自定义ClassLoader
- java不同类加载器对instanceof关键字运算的影响
- 遍历同类名的不同对话框
- 同类不同对象造成的问题
- log4j中不同类输出到不同文件
- 重定义不同基类的同名虚函数
- idea14 添加工具栏,例如后退,前进,idea14后退按钮不显示
- ArcGIS 10.2以上GP服务调用
- 性能优化,进无止境-内存篇(上)
- 游戏API接口本身的意义是什么
- 判断是否打开了软键盘 自动打开软键盘
- 由不同ClassLoader加载的同名类属于不同类
- Android中的Conflict with dependency 'com.google.code.findbugs:jsr305'
- ubuntu下搭建apache+gerrit+h2+git环境
- hive和hbase有什么关系和区别?
- 给元素添加节点
- "-disable-load-framework" 配置
- Swift学习记录(三)
- 2015年33期Java/Spring/Struts2/web/基础/就业班视频
- MongoDB常见问题及解决方案