类与类加载器

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

否则,即使这两个类来源于同一个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!
posted @ 2019-05-21 10:29  caotao0918  阅读(215)  评论(0编辑  收藏  举报