java虚拟机之类加载机制(三)

如何判断java类是否是同一个类:

(1)查看完整类名是否一样,这个类名包含类所在的包名;

(2)查看加载这个类的classloader是否是同一个,就是同一个是指classloader返回的实例是否是同一个实例。

java代码是和java虚拟机之类加载机制(一)中的代码是一样的,只不过是main方法不一样....

  PathClassLoader pathClassLoader1 = new PathClassLoader();
  Class myClass1 = pathClassLoader1.findClass("com.classloader.HelloWorld");
  System.out.println(myClass1.newInstance());
  PathClassLoader pathClassLoader2 = new PathClassLoader();
  Class myClass2 = pathClassLoader2.findClass("com.classloader.HelloWorld");
  System.out.println(myClass2.newInstance());

 结果:com.classloader.HelloWorld@61de33
           com.classloader.HelloWorld@10b30a7

可以看出虽然类的全名是一样的,但是打印出来的结果是两个不同的类实例对象!

如果将上面的代码改成:

PathClassLoader pathClassLoader1 = new PathClassLoader();
  Class myClass1 = pathClassLoader1.findClass("com.classloader.HelloWorld");
  System.out.println(myClass1.newInstance());
  Class myClass2 = pathClassLoader1.findClass("com.classloader.HelloWorld");
  System.out.println(myClass2.newInstance());
  System.out.println(myClass1.equals(myClass1));

打印结果:

Exception in thread "main" java.lang.LinkageError: loader (instance of  com/classloader/PathClassLoader): attempted  duplicate class definition for name: "com/classloader/HelloWorld"
 at java.lang.ClassLoader.defineClass1(Native Method)
 at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
 at java.lang.ClassLoader.defineClass(ClassLoader.java:466)
 at com.classloader.PathClassLoader.findClass(PathClassLoader.java:39)
 at com.classloader.PathClassLoader.main(PathClassLoader.java:55)

总结:所以即使是同一个classloader类的两个实例,加载同一个类也会不一样!而且同一个类,JVM不会加载两次!

你可能感兴趣的:(java虚拟机之类加载机制(三))