FileSysClassLoader

  1. package com.javabook.classloader;
  2. import java.io.BufferedInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import com.javabook.classloader.service.api.ISimpleService;
  10. /**
  11. * @author Summer Lu
  12. * @email gmluyang@gmail.com
  13. * @date 2014-8-25
  14. *
  15. */
  16. public class FileSysClassLoader extends ClassLoader {
  17. /**
  18. * classPath
  19. */
  20. private String classPath;
  21. /**
  22. * @param classPath
  23. */
  24. public FileSysClassLoader(String classPath) {
  25. this.classPath = classPath;
  26. }
  27. @Override
  28. protected Class<?> findClass(String name) throws ClassNotFoundException {
  29. byte[] classData = getClassData(name);
  30. if (classData == null) {
  31. throw new ClassNotFoundException();
  32. } else {
  33. return defineClass(name, classData, 0, classData.length);
  34. }
  35. }
  36. /**
  37. * @param className
  38. * @return
  39. */
  40. private byte[] getClassData(String className) {
  41. String path = classNameToPath(className);
  42. try {
  43. // io
  44. InputStream is = new BufferedInputStream( new FileInputStream(path) );
  45. // os
  46. OutputStream os = new ByteArrayOutputStream();
  47. // buffer
  48. int bufferSize = 4096;
  49. byte[] buffer = new byte[bufferSize];
  50. // read/write
  51. int bytesNumRead = 0;
  52. while ((bytesNumRead = is.read(buffer)) != -1) {
  53. os.write(buffer, 0, bytesNumRead);
  54. }
  55. // flush
  56. os.flush();
  57. // toByteArray
  58. return ((ByteArrayOutputStream)os).toByteArray();
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }
  62. return null;
  63. }
  64. /**
  65. * @param className
  66. * @return
  67. */
  68. private String classNameToPath(String className) {
  69. return classPath + File.separatorChar + className.replace('.', File.separatorChar) + ".class";
  70. }
  71. /**
  72. * @param args
  73. */
  74. public static void main(String[] args) {
  75. try {
  76. // File
  77. String file = "C:\\mybin\\";
  78. // fileSystemClassLoader
  79. FileSysClassLoader fileSysClassLoader = new FileSysClassLoader(file);
  80. // ----------------------------------------------------------------------------------------------------
  81. // SimpleServiceLowerCaseImpl
  82. // ----------------------------------------------------------------------------------------------------
  83. // simpleServiceLowerCaseImpl
  84. String simpleServiceLowerCaseImpl = "com.javabook.classloader.service.impl.SimpleServiceLowerCaseImpl";
  85. // simpleServiceLowerCaseImplClass2
  86. Class<?> simpleServiceLowerCaseImplClass2 = fileSysClassLoader.loadClass(simpleServiceLowerCaseImpl);
  87. System.out.println( simpleServiceLowerCaseImplClass2.getClassLoader() + " -> " + simpleServiceLowerCaseImplClass2.getName());
  88. ISimpleService simpleServiceLowerCaseImpl2 = (ISimpleService) simpleServiceLowerCaseImplClass2.newInstance();
  89. System.out.println(simpleServiceLowerCaseImpl2.calculate("Abc"));
  90. // ----------------------------------------------------------------------------------------------------
  91. // SimpleServiceUpperCaseImpl
  92. // ----------------------------------------------------------------------------------------------------
  93. System.out.println();
  94. // simpleServiceUpperCaseImpl
  95. String simpleServiceUpperCaseImpl = "com.javabook.classloader.service.impl.SimpleServiceUpperCaseImpl";
  96. Class<?> simpleServiceUpperCaseImplClass2 = fileSysClassLoader.loadClass(simpleServiceUpperCaseImpl);
  97. System.out.println( simpleServiceUpperCaseImplClass2.getClassLoader() + " -> " + simpleServiceUpperCaseImplClass2.getName());
  98. ISimpleService simpleServiceUpperCaseImpl2 = (ISimpleService) simpleServiceUpperCaseImplClass2.newInstance();
  99. System.out.println(simpleServiceUpperCaseImpl2.calculate("Abc"));
  100. } catch (Exception e) {
  101. e.printStackTrace();
  102. }
  103. }
  104. }

Console

com.javabook.classloader.FileSysClassLoader@74a14482 -> com.javabook.classloader.service.impl.SimpleServiceLowerCaseImpl
com.javabook.classloader.service.impl.SimpleServiceLowerCaseImpl:abc

com.javabook.classloader.FileSysClassLoader@74a14482 -> com.javabook.classloader.service.impl.SimpleServiceUpperCaseImpl
com.javabook.classloader.service.impl.SimpleServiceUpperCaseImpl:ABC