package com.neverwinterdp.jvmagent.bootstrap; import java.io.File; import java.io.FileInputStream; import java.lang.instrument.Instrumentation; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; import java.util.Properties; public class PremainBootstrap { public static void premain(String pluginPath, Instrumentation inst) throws Exception { ClassLoader oldClassloader = Thread.currentThread().getContextClassLoader() ; try { Properties props = new Properties() ; props.load(new FileInputStream(pluginPath + "/agent.properties")); String pluginClassName = props.getProperty("plugin.class") ; boolean newClassloader = "true".equalsIgnoreCase(props.getProperty("plugin.classloader.isolate")); ClassLoader cl = null ; if(newClassloader) { File pluginDir = new File(pluginPath); List<URL> jars = new ArrayList<URL>(); for(File sel : pluginDir.listFiles()) { String name = sel.getName(); if(name.endsWith(".jar")) { URL url = new URL("file:" + sel.getCanonicalPath()); jars.add(url); System.out.println("add jar: " + url); } } URL[] jarPaths = new URL[jars.size()]; jarPaths = jars.toArray(jarPaths); cl = new URLClassLoader(jarPaths, Thread.currentThread().getContextClassLoader()) ; } else { cl = Thread.currentThread().getContextClassLoader(); } Thread.currentThread().setContextClassLoader(cl); Class<BootstrapAgentPlugin> pluginClass = (Class<BootstrapAgentPlugin>) cl.loadClass(pluginClassName); BootstrapAgentPlugin plugin = pluginClass.newInstance(); props.remove("plugin.class"); props.remove("plugin.classloader.isolate"); plugin.run(props, inst); } finally { Thread.currentThread().setContextClassLoader(oldClassloader); } } }