类与类加载器

Posted caotao0918

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类与类加载器相关的知识,希望对你有一定的参考价值。

比较两个类是否"相等",只有在这两个类是由同一个类加载器加载的前提下才有意义,

否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。

 

 1 /**
 2  * 类加载器与instanceof关键字演示
 3  * 
 4  * @author zzm
 5  */
 6 package org.codeman;
 7 
 8 import java.io.*;
 9 
10 public class ClassLoaderTest {
11 
12     public static void main(String[] args) throws Exception {
13 
14         ClassLoader myLoader = new ClassLoader() {
15             @Override
16             public Class<?> loadClass(String name) throws ClassNotFoundException {
17                 try {
18                     String fileName = name.substring(name.lastIndexOf(".") + 1) + ".class";
19                     InputStream is = getClass().getResourceAsStream(fileName);
20                     if (is == null) {
21                         return super.loadClass(name);
22                     }
23                     byte[] b = new byte[is.available()];
24                     is.read(b);
25                     return defineClass(name, b, 0, b.length);
26                 } catch (IOException e) {
27                     throw new ClassNotFoundException(name);
28                 }
29             }
30         };
31 
32         Object obj = myLoader.loadClass("org.codeman.ClassLoaderTest").newInstance();
33 
34         System.out.println(obj.getClass());
35         System.out.println(obj instanceof org.codeman.ClassLoaderTest);
36     }
37 }

 运行结果:

class org.codeman.ClassLoaderTest

false

 

两行输出结果中,从第一行可以看出,这个对象确实是org.codeman.ClassLoaderTest实例化出来的对象,但从第二句可以发现这个对象与类org.codeman.ClassLoaderTest 做所属类型检查的时候却返回了false, 这是因为虚拟机中存在了两个ClassLoaderTest类,一个是由系统应用程序类加载器加载的,另外一个是由我们自定义的类加载器加载的,虽然都来自同一个Class文件,但依然是两个独立的类,做对象所属类型检查时结果自然为false!

以上是关于类与类加载器的主要内容,如果未能解决你的问题,请参考以下文章

类加载器

类加载器

JVM类加载器

装饰器、装饰器类与类装饰器(三)

JVM学习记录-类加载器

JVM:类加载器·双亲委派模型