1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
/* * @(#)ToolProvider.java 1.11 06/09/25 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package javax.tools; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.net.MalformedURLException; /** * Provides methods for locating tool providers, for example, * providers of compilers. This class complements the * functionality of {@link java.util.ServiceLoader}. * * @author Peter von der Ahé * @since 1.6 */ public class ToolProvider { private ToolProvider() {} /** * Gets the Java™ programming language compiler provided with this platform. * @return the compiler provided with this platform or {@code * null} if no compiler is provided */ public static JavaCompiler getSystemJavaCompiler() { if (Lazy.compilerClass == null) return null; try { return Lazy.compilerClass.newInstance(); } catch (Throwable e) { return null; } } /** * Returns the class loader for tools provided with this platform. * This does not include user-installed tools. Use the * {@linkplain java.util.ServiceLoader service provider mechanism} * for locating user installed tools. * * @return the class loader for tools provided with this platform * or {@code null} if no tools are provided */ public static ClassLoader getSystemToolClassLoader() { if (Lazy.compilerClass == null) return null; return Lazy.compilerClass.getClassLoader(); } /** * This class will not be initialized until one of the above * methods are called. This ensures that searching for the * compiler does not affect platform start up. */ static class Lazy { private static final String defaultJavaCompilerName = "com.sun.tools.javac.api.JavacTool"; private static final String[] defaultToolsLocation = { "lib", "tools.jar" }; static final Class<? extends JavaCompiler> compilerClass; static { Class<? extends JavaCompiler> c = null; try { c = findClass().asSubclass(JavaCompiler.class); } catch (Throwable t) { // ignored } compilerClass = c; } private static Class<?> findClass() throws MalformedURLException, ClassNotFoundException { try { return enableAsserts(Class.forName(defaultJavaCompilerName, false, null)); } catch (ClassNotFoundException e) { // ignored, try looking else where } File file = new File(System.getProperty("java.home")); if (file.getName().equalsIgnoreCase("jre")) file = file.getParentFile(); for (String name : defaultToolsLocation) file = new File(file, name); URL[] urls = {file.toURI().toURL()}; ClassLoader cl = URLClassLoader.newInstance(urls); cl.setPackageAssertionStatus("com.sun.tools.javac", true); return Class.forName(defaultJavaCompilerName, false, cl); } private static Class<?> enableAsserts(Class<?> cls) { try { ClassLoader loader = cls.getClassLoader(); if (loader != null) loader.setPackageAssertionStatus("com.sun.tools.javac", true); } catch (SecurityException ex) { // ignored } return cls; } } }