A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 兜兜转转 中级黑马   /  2013-9-10 21:35  /  955 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.ByteArrayOutputStream;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.InputStream;

  5. public class MyClassLoader2 extends ClassLoader
  6. {
  7. private String name ;
  8. private String path= "d:\\";
  9. public MyClassLoader2(String name)
  10. {
  11. super();
  12. this.name = name;
  13. }
  14. public MyClassLoader2(ClassLoader parent , String name)
  15. {
  16. super(parent);
  17. this.name = name;
  18. }
  19. public String getName()
  20. {
  21. return name;
  22. }
  23. public String getPath()
  24. {
  25. return path;
  26. }
  27. public void setPath(String path)
  28. {
  29. this.path = path;
  30. }
  31. public String toString()
  32. {
  33. return this.name;
  34. }
  35. @Override
  36. protected Class<?> findClass(String name) throws ClassNotFoundException
  37. {
  38. byte[] date = this.loadClassDate(name);
  39. return this.defineClass(name , date , 0 ,date.length);
  40. }

  41. public byte[] loadClassDate(String name)
  42. {
  43. InputStream is = null;
  44. ByteArrayOutputStream baos = null;
  45. byte[] date = null;
  46. try
  47. {
  48. baos = new ByteArrayOutputStream();
  49. is = new FileInputStream(new File(this.path + name+ ".class"));
  50. int b = 0;
  51. while( (b = is.read()) != -1)
  52. {
  53. baos.write(b);
  54. }
  55. date = baos.toByteArray();
  56. }
  57. catch (Exception e)
  58. {
  59. e.printStackTrace();
  60. }
  61. finally
  62. {

  63. try
  64. {
  65. is.close();
  66. baos.close();
  67. }
  68. catch(Exception e)
  69. {
  70. e.printStackTrace();
  71. }
  72. }
  73. return date;
  74. }
  75. }
复制代码
以上代码我只知道写,但是不知道具体的执行流程和细节?loadClass()这个方法到底是执行那些代码?

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

2 个回复

倒序浏览
为沙发而来。
回复 使用道具 举报
  1. protected Class<?> loadClass(String name, boolean resolve)
  2.         throws ClassNotFoundException
  3.     {
  4.         synchronized (getClassLoadingLock(name)) {
  5.             // First, check if the class has already been loaded
  6.             Class c = findLoadedClass(name);
  7.             if (c == null) {
  8.                 long t0 = System.nanoTime();
  9.                 try {
  10.                     if (parent != null) {
  11.                         c = parent.loadClass(name, false);
  12.                     } else {
  13.                         c = findBootstrapClassOrNull(name);
  14.                     }
  15.                 } catch (ClassNotFoundException e) {
  16.                     // ClassNotFoundException thrown if class not found
  17.                     // from the non-null parent class loader
  18.                 }

  19.                 if (c == null) {
  20.                     // If still not found, then invoke findClass in order
  21.                     // to find the class.
  22.                     long t1 = System.nanoTime();
  23.                     c = findClass(name);

  24.                     // this is the defining class loader; record the stats
  25.                     sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
  26.                     sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
  27.                     sun.misc.PerfCounter.getFindClasses().increment();
  28.                 }
  29.             }
  30.             if (resolve) {
  31.                 resolveClass(c);
  32.             }
  33.             return c;
  34.         }
  35.     }
复制代码
这是loadClass的源码。首先用findLoadClass查找是否加载过这个字节码。如果有就直接返回。如果没有先利用委托加载器查找。没有委托加载器。调用findBootstrapClassOrNull(name)查找。这方法就是委托给BootStrap进行查找。这个调用是调用本地方法。具体的代码为我也没查。希望后面大神补充
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马