Advertisement
Guest User

ClassLoading

a guest
Jan 11th, 2013
574
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.63 KB | None | 0 0
  1. package com.stackoverflow;
  2. import java.lang.reflect.Method;
  3. import java.net.URI;
  4. import java.net.URL;
  5. import java.net.URLClassLoader;
  6. import java.nio.file.Path;
  7. import java.nio.file.Paths;
  8. import java.util.Arrays;
  9. import java.util.List;
  10.  
  11. import javax.tools.JavaCompiler;
  12. import javax.tools.JavaFileObject;
  13. import javax.tools.SimpleJavaFileObject;
  14. import javax.tools.StandardJavaFileManager;
  15. import javax.tools.StandardLocation;
  16. import javax.tools.ToolProvider;
  17.  
  18. public class Test1 {
  19.  
  20.     private static final Path TEMP_PATH = Paths.get("/tmp/");
  21.  
  22.     public static void main(String[] args) throws Exception {
  23.         String thisPackage = Test1.class.getPackage().getName();
  24.         String className = thisPackage + ".Formula";
  25.         String body = "package " + thisPackage + ";   "
  26.                     + "public class Formula {         "
  27.                     + "    double calculateFails() {  "
  28.                     + "        return 42;             "
  29.                     + "    }                          "
  30.                     + "}                              ";
  31.  
  32.         compile(className, body, TEMP_PATH);
  33.        
  34.         loadClass(className, TEMP_PATH);
  35.        
  36.     }
  37.  
  38.     private static void loadClass(String className, Path path) throws Exception {
  39.         // com/stackoverflow/Test1.class
  40.         String idem = Test1.class.getCanonicalName().replace(".", "/") + ".class";
  41.         // The URL
  42.         String classFile = Test1.class.getClassLoader().getResource(idem).toString();
  43.         // Remove the class name
  44.         String repository = classFile.substring(0, classFile.length() - idem.length());
  45.        
  46.         URL location = new URL(repository);
  47.         URLClassLoader loader = new URLClassLoader(new URL[]{path.toUri().toURL(), location}, null);
  48.        
  49.         Class<?> formulaClass = loader.loadClass(className);
  50.        
  51.         Class<Test1> test1 = (Class<Test1>) loader.loadClass(Test1.class.getCanonicalName());
  52.        
  53.         assert test1.getClassLoader().equals(formulaClass.getClassLoader()) ;
  54.        
  55.         Method compute = test1.getDeclaredMethod("compute", Class.class);
  56.         compute.invoke(test1, formulaClass);
  57.        
  58.         loader.close();
  59.     }
  60.    
  61.     public static void compute(Class<?> formulaClass) throws Exception {
  62.         Method calculateFails = formulaClass.getDeclaredMethod("calculateFails");
  63.         //next line throws exception:
  64.         double valueFails = (Double) calculateFails.invoke(formulaClass.newInstance());
  65.         System.out.println("HOORAY! valueFails = " + valueFails);
  66.     }
  67.  
  68.     private static void compile(String className, String body, Path path) throws Exception {
  69.         List<JavaSourceFromString> sourceCode = Arrays.asList(new JavaSourceFromString(className, body));
  70.  
  71.         JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  72.         StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
  73.         fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(path.toFile()));
  74.         boolean ok = compiler.getTask(null, fileManager, null, null, null, sourceCode).call();
  75.  
  76.         System.out.println("compilation ok = " + ok);
  77.     }
  78.  
  79.     public static class JavaSourceFromString extends SimpleJavaFileObject {
  80.         final String code;
  81.  
  82.         JavaSourceFromString(String name, String code) {
  83.             super(URI.create("string:///" + name.replace('.', '/') + JavaFileObject.Kind.SOURCE.extension),
  84.                     JavaFileObject.Kind.SOURCE);
  85.             this.code = code;
  86.         }
  87.  
  88.         @Override
  89.         public CharSequence getCharContent(boolean ignoreEncodingErrors) {
  90.             return code;
  91.         }
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement