Launcher/libLauncher/src/main/java/ru/gravit/launcher/LauncherAgent.java

53 lines
2.1 KiB
Java
Raw Normal View History

2018-09-17 10:07:32 +03:00
package ru.gravit.launcher;
import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;
import java.util.ArrayList;
import java.util.jar.JarFile;
import javassist.bytecode.ClassFile;
2018-09-17 10:20:34 +03:00
import ru.gravit.utils.helper.LogHelper;
2018-09-17 10:07:32 +03:00
import ru.gravit.launcher.transformers.SystemClassLoaderTransformer;
@LauncherAPI
public class LauncherAgent {
private static final boolean enabled = false;
private static boolean isAgentStarted=false;
2018-09-17 10:07:32 +03:00
public static Instrumentation inst;
public static void addJVMClassPath(String path) throws IOException {
LogHelper.debug("Launcher Agent addJVMClassPath");
inst.appendToSystemClassLoaderSearch(new JarFile(path));
}
public boolean isAgentStarted()
{
return isAgentStarted;
}
2018-09-17 10:07:32 +03:00
public static long getObjSize(Object obj) {
return inst.getObjectSize(obj);
}
public static void premain(String agentArgument, Instrumentation instrumentation) {
System.out.println("Launcher Agent");
inst = instrumentation;
isAgentStarted = true;
2018-09-17 10:07:32 +03:00
if(ClassFile.MAJOR_VERSION > ClassFile.JAVA_8 || enabled) {
inst.addTransformer(new SystemClassLoaderTransformer());
Class<?>[] classes = inst.getAllLoadedClasses(); // Получаем список уже загруженных классов, которые могут быть изменены. Классы, которые ещё не загружены, будут изменены при загрузке
ArrayList<Class<?>> classList = new ArrayList<>();
for (Class<?> classe : classes)
if (inst.isModifiableClass(classe))
classList.add(classe);
// Reload classes, if possible.
Class<?>[] workaround = new Class[classList.size()];
try {
inst.retransformClasses(classList.toArray(workaround)); // Запускаем процесс трансформации
} catch (UnmodifiableClassException e) {
System.err.println("MainClass was unable to retransform early loaded classes: " + e);
}
}
}
}