五、关于两个ClassLoader载入同一个类
注意:由两个不同的ClassLoader载入的同一个类,其是不同类型的,因此如果进行赋值会报ClassCastException
示例:
- package Test;
-
import java.io.*;
-
import java.util.*;
-
public class TestClassLoader extends ClassLoader {
-
-
protected Map<String, Class> cache = new HashMap<String, Class>();
-
-
public TestClassLoader() {
-
super();
- }
-
-
protected Class<?> findClass(String name) throws ClassNotFoundException {
-
if (cache.get(name) != null) {
-
return cache.get(name);
- }
-
try {
-
String tname = name.replace('.', '/');
-
File file = new File("c://" + tname + ".class");
-
FileInputStream in = new FileInputStream(file);
-
BufferedInputStream bufIn = new BufferedInputStream(in);
-
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
-
BufferedOutputStream bufOut = new BufferedOutputStream(byteOut);
-
byte[] buffer = new byte[4096];
-
int len = -1;
-
while((len = bufIn.read(buffer)) != -1) {
-
bufOut.write(buffer, 0, len);
- }
- bufOut.flush();
- byteOut.flush();
-
byte[] data = byteOut.toByteArray();
-
Class cls = defineClass(name, data, 0, data.length);
- cache.put(name, cls);
-
return cls;
-
} catch (IOException e) {
- e.printStackTrace();
- }
-
return null;
- }
- }
-
class TestLoaderA {
-
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
-
TestClassLoader loader = new TestClassLoader();
-
System.out.println(TestAImp1.class.getClassLoader());
-
System.out.println(loader.findClass("Test.TestAImp1").getClassLoader());
-
TestAImp1 test = (TestAImp1)loader.findClass("Test.TestAImp1").newInstance();
- test.test();
-
- }
- }
-
public class TestAImp1 extends AbstractTestA {
-
public void test() {
- System.out.println(Thread.currentThread().toString());
-
System.out.println("Test");
- }
- }
运行以上代码结果:
sun.misc.Launcher$AppClassLoader@197d257
Test.TestClassLoader@1b90b39
Exception in thread "main" java.lang.ClassCastException: Test.TestAImp1
at Test.TestLoaderA.main(TestClassLoader.java:84)
分享到:
相关推荐
Java ClassLoader定制实例
深入了解Java_ClassLoader,Bytecde.pdf
java classloader classpath 张孝祥
破解java加密的ClassLoader.java,在classloader植入破解代码
理解Java ClassLoader机制
Java ClassLoader Tutorial
Sun 官方关于 ClassLoader原理的文章,值得一看
深入Java虚拟机_ClassLoader深入Java虚拟机_ClassLoader
Java中ClassLoader的解析,从ClassLoader的角度分析了JVM,装载类,创建类的对象的整个过程,更清晰的了解JVM的运行机制。
Understanding the Java ClassLoader
Understanding the Java ClassLoader.pdf
NULL 博文链接:https://sbiigu.iteye.com/blog/260456
java classloader 讲义-淘宝网
java classLoader 的全面讲解 从基本概念到具体的应用 里面共有三份资料。
1.java classloader 的概述 2.java classloader 的分类 3.自定义 java classloader
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
ClassLoader类加载器讲解,理解JAVA类加载机制
了解 Java ClassLoader