You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ClassBuilderExecutor.java 1.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package com.uqac.rthoni.java_rmi.server.executors;
  2. import com.uqac.rthoni.java_rmi.common.Command;
  3. import com.uqac.rthoni.java_rmi.server.ServerApplication;
  4. import javax.tools.JavaCompiler;
  5. import javax.tools.ToolProvider;
  6. import java.io.ByteArrayOutputStream;
  7. import java.io.File;
  8. import java.nio.charset.StandardCharsets;
  9. import java.util.List;
  10. import java.util.Vector;
  11. import java.util.stream.Collectors;
  12. /**
  13. * Created by robin on 9/16/16.
  14. */
  15. public class ClassBuilderExecutor extends AbstractCommandExecutor {
  16. @Override
  17. public String getCommandName() {
  18. return "compilation";
  19. }
  20. @Override
  21. public String run(Command command, ServerApplication server) throws Exception
  22. {
  23. Vector<String> files = command.getArgumentAsList(0, false);
  24. String classDir = command.getArgument(1, false);
  25. File classFile = new File(server.getClassDir(), classDir);
  26. classFile.mkdirs();
  27. List<String> sources = files.stream().map(f -> new File(server.getSourceDir(), f).getPath() ).collect(Collectors.toList());
  28. Vector<String> arguments = new Vector<>();
  29. arguments.add("-d");
  30. arguments.add(classFile.getPath());
  31. arguments.addAll(sources);
  32. JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  33. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  34. compiler.run(null, outputStream, outputStream, arguments.toArray(new String[arguments.size()]));
  35. // Load and instantiate compiled class.
  36. // URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
  37. // Class<?> cls = Class.forName("test.Test", true, classLoader); // Should print "hello".
  38. // Object instance = cls.newInstance(); // Should print "world".
  39. // System.out.println(instance); // Should print "test.Test@hashcode".
  40. return new String(outputStream.toByteArray(), StandardCharsets.UTF_8);
  41. }
  42. }