package nebulachain.agent; import java.lang.instrument.Instrumentation; import java.util.jar.JarFile; public class Startup { private static volatile ClassLoader CLASSLOADER; private static volatile Object CORE; public synchronized static void resetClassLoader() { CLASSLOADER = null; } public synchronized static void resetCore() { if (CORE != null) { } CORE = null; } private static void defineClassLoader(String coreJar) throws Throwable { final ClassLoader classLoader; // TODO ONLY TEST resetClassLoader(); if (null != CLASSLOADER) { classLoader = CLASSLOADER; } else { classLoader = new CoreClassLoader(coreJar); final Class<?> adviceWeaverClass = classLoader.loadClass("com.github.ompc.greys.core.advisor.AdviceWeaver"); Spy.initForFirst(classLoader, adviceWeaverClass.getMethod("methodOnBegin", int.class, ClassLoader.class, String.class, String.class, String.class, Object.class, Object[].class), adviceWeaverClass.getMethod("methodOnReturnEnd", Object.class, int.class), adviceWeaverClass.getMethod("methodOnThrowingEnd", Throwable.class, int.class), adviceWeaverClass.getMethod("methodOnInvokeBeforeTracing", int.class, Integer.class, String.class, String.class, String.class), adviceWeaverClass.getMethod("methodOnInvokeAfterTracing", int.class, Integer.class, String.class, String.class, String.class), adviceWeaverClass.getMethod("methodOnInvokeThrowTracing", int.class, Integer.class, String.class, String.class, String.class, String.class), Startup.class.getMethod("resetClassLoader")); } CLASSLOADER = classLoader; } public static void premain(String args, Instrumentation inst) { main(args, inst); } public static void agentmain(String args, Instrumentation inst) { main(args, inst); } private static synchronized void main(final String args, final Instrumentation inst) { try { String corePath = args.trim(); inst.appendToBootstrapClassLoaderSearch(new JarFile(Startup.class.getProtectionDomain().getCodeSource().getLocation().getFile())); defineClassLoader(corePath); final Class<?> coreClass = CLASSLOADER.loadClass("nebulachain.core.Core"); CORE = coreClass.getMethod("getInstance", Instrumentation.class).invoke(null, inst); } catch (Throwable t) { t.printStackTrace(); } } }