类加载器

冷不防 2021-09-26 14:34 532阅读 0赞

对于任意一个类,都需要由加载它的类加载器这个类本身一同确立起在Java虚拟机中的唯一性,下面将采用书中的例子进行试验说明。

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. /* * 对于任意一个类,都需要由加载它的类加载器这个类本身一同确立起在Java虚拟机中的唯一性 * 每一个类加载器,都拥有独立的类名称空间。 * 即 比较两个类是否相等,只要这两个类是由同一个类加载器加载的前提下才有意义。 * 类加载器与instanceof关键字的演示 */
  4. public class ClassLoaderDemo {
  5. /** * @param args * @throws ClassNotFoundException * @throws IllegalAccessException * @throws InstantiationException */
  6. public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
  7. // TODO Auto-generated method stub
  8. ClassLoader myLoader = new ClassLoader() {
  9. @Override
  10. //自定义类加载器
  11. public Class<?> loadClass(String name)
  12. throws ClassNotFoundException {
  13. try {
  14. //System.out.println(name);
  15. // TODO Auto-generated method stub
  16. String filename = name.substring(name.indexOf("." )+ 1)
  17. + ".class";
  18. InputStream is = getClass().getResourceAsStream(filename);
  19. if (is == null) {
  20. return super.loadClass(name);
  21. }
  22. byte[] b = new byte[is.available()];
  23. is.read(b);
  24. return defineClass(name, b, 0, b.length);
  25. } catch (IOException e) {
  26. // TODO: handle exception
  27. throw new ClassNotFoundException(name);
  28. }
  29. }
  30. };
  31. Object obj;
  32. try {
  33. //调用自定义类加载器得到类实例
  34. obj = myLoader.loadClass("类加载机制和反射.ClassLoaderDemo").newInstance();
  35. System.out.println(obj.getClass());
  36. System.out.println(obj instanceof 类加载机制和反射.ClassLoaderDemo);
  37. //使用系统应用程序类加载器加载的
  38. Object obj1 = new ClassLoaderDemo();
  39. System.out.println(obj1 instanceof 类加载机制和反射.ClassLoaderDemo);
  40. } catch (Exception e) {
  41. // TODO Auto-generated catch block
  42. e.printStackTrace();
  43. }
  44. }
  45. }

试验结果如下:

  1. class 类加载机制和反射.ClassLoaderDemo
  2. false
  3. true

原因:
虚拟机中存在了两个ClassLoaderDemo类,一个是由系统应用程序类加载的, 另一个是由我们自定义的类加载器加载的,虽然来自同一个Class文件,但是仍然是两个独立的类

发表评论

表情:
评论列表 (有 0 条评论,532人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ——

    虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作

    相关

    回顾一下类加载过程 类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 ![类加载过程][format_png] 一个非数组类的加载阶段

    相关

    类的加载 什么是类的加载? 当程序需要使用某个类的时候,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类的初始化。 加载

    相关

    类加载器 虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类

    相关

    对于任意一个类,都需要由加载它的类加载器这个类本身一同确立起在Java虚拟机中的唯一性,下面将采用书中的例子进行试验说明。 import java.io.IOExce