Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

ParallelCapableClassLoader.java 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import java.io.ByteArrayOutputStream;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. public class ParallelCapableClassLoader extends ClassLoader {
  6. private final ClassLoader delegate;
  7. private final String classNameToHandle;
  8. static {
  9. if (!ClassLoader.registerAsParallelCapable())
  10. throw new RuntimeException("Failed to register " + ParallelCapableClassLoader.class.getName() + " as parallel-capable");
  11. }
  12. public ParallelCapableClassLoader(ClassLoader delegate, String classNameToHandle) {
  13. this.delegate = delegate;
  14. this.classNameToHandle = classNameToHandle;
  15. }
  16. @Override
  17. protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
  18. Class<?> c = this.findLoadedClass(name);
  19. if (c == null && name.equals(classNameToHandle)) {
  20. byte[] bytes = getClassBytes(name);
  21. try {
  22. c = defineClass(name, bytes, 0, bytes.length);
  23. }
  24. catch (LinkageError e) {
  25. c = findLoadedClass(name);
  26. if (c == null)
  27. throw e;
  28. }
  29. }
  30. if (c == null)
  31. c = delegate.loadClass(name);
  32. if (resolve)
  33. this.resolveClass(c);
  34. return c;
  35. }
  36. private byte[] getClassBytes(String name) {
  37. String classFilePath = name.replace('.', File.separatorChar) + ".class";
  38. try (InputStream inputStream = delegate.getResourceAsStream(classFilePath)) {
  39. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  40. int bytesRead;
  41. byte[] buffer = new byte[4096];
  42. while ((bytesRead = inputStream.read(buffer)) != -1) {
  43. outputStream.write(buffer, 0, bytesRead);
  44. }
  45. return outputStream.toByteArray();
  46. }
  47. catch (IOException e) {
  48. throw new RuntimeException(e);
  49. }
  50. }
  51. }