Library to modify classes at runtime using Instrumentation
- Add dependency
-
Using Gradle
implementation("io.github.usernugget:class-redefiner:2.1.1")
-
Using Maven
<dependency> <groupId>io.github.usernugget</groupId> <artifactId>class-redefiner</artifactId> <version>2.1.1</version> </dependency>
-
- Basic:
// Mapping that will modify ClassValue behavior
@Mapping(targetClass = ClassValue.class)
public static final class ClassValueMapping {
// Inject code on top of ClassValue::alwaysTrue
@Head
public static void alwaysTrue() {
Op.returnOp(false);
}
}
public static final class ClassValue {
// Basic method that always return true
public static boolean alwaysTrue() {
return true;
}
}
// Create new redefiner
ClassRedefiner redefiner = new ClassRedefiner(
new StandardAttachTypes(),
new StandardHandlerTypes()
);
// Initialize javaagent
try {
redefiner.initializeAgent();
} catch (Throwable throwable) {
throw new IllegalStateException("unable to initialize javaagent", throwable);
}
// Redefine ClassValue using ClassValueMapping
try {
redefiner.transformClass(ClassValueMapping.class);
} catch (Throwable throwable) {
throw new IllegalStateException("unable to apply mapping", throwable);
}
// Verify that ClassValue::alwaysTrue now return false
System.out.println("alwaysTrue is " + ClassValue.alwaysTrue());