Fix Agent and WideningTransformer and ClassPatcher

This commit is contained in:
2026-06-11 13:19:04 +02:00
parent 786257ad0e
commit 961331f029
6 changed files with 105 additions and 279 deletions
@@ -19,7 +19,11 @@
package de.steamwar;
import java.io.File;
import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
@@ -38,14 +42,11 @@ import java.util.logging.Logger;
*/
public class Agent {
private Agent() {
/* This utility class should not be instantiated */
throw new IllegalStateException("Utility class");
}
private static final Logger LOG = Logger.getLogger("AccessWidenerAgent");
// Exposed so tests or other code can inspect the live transformer
static volatile WideningTransformer transformer;
// -javaagent: startup
public static void premain(String args, Instrumentation inst) {
init(inst);
@@ -54,13 +55,22 @@ public class Agent {
private static void init(Instrumentation inst) {
LOG.info("[AccessWidener] Agent initialising.");
WideningTransformer t = new WideningTransformer(inst);
transformer = t;
// --- Phase 2: register transformer for future class loads ---
// canRetransform=true so we can call retransformClasses() later
inst.addTransformer(t, true);
List<AccessWidenerEntry> entries = new ArrayList<>();
File file = new File(new File(".").getAbsoluteFile(), "plugins/");
File[] files = file.listFiles();
if (files == null) files = new File[0];
for (File jarFile : files) {
if (!jarFile.isFile()) continue;
if (!jarFile.getName().endsWith(".jar")) continue;
try {
entries.addAll(Utils.findAndParseAccessWideners(jarFile.toPath()));
} catch (IOException e) {
LOG.warning("Failed to parse access wideners from " + jarFile.getAbsolutePath());
}
}
LOG.info("[AccessWidener] Loaded " + entries.size() + " access wideners.");
inst.addTransformer(new WideningTransformer(entries), false);
LOG.info("[AccessWidener] Agent ready.");
}
}