JVM Hook Framework is designed for injecting java classes with friendly apis using SpongePowered/mixin
You need add Maven Central and https://repo.spongepowered.org/repository/maven-public/ into your repositories.
plugins {
id 'java-library'
}
repositories {
mavenCentral()
maven { url = 'https://repo.spongepowered.org/repository/maven-public/' }
maven { url = 'https://files.minecraftforge.net/maven/' }
}
dependencies {
api 'io.github.karlatemp.jhf:api:<version>'
}- Create a new class named
myjhfplugin.Startup(or other you like) - Create a new file in project resources named
jhf-main.txt - Write
myjhfplugin.Startinjhf-main.txt - Add a static method in
myjhfplugin.Startupnamed launch with no parameter and void return typeprivate static void launch() throws Throwable {}
You need create a class module of class you want to inject.
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
@Mixin(targets = "testunit.RunTester")
public class MixinRunTester {
@Overwrite
public static void error() {
}
}Then, you need create a mixin configuration file in your project resources. Suggested path format
is ${project-name}/mixin/${config-name}.json
{
"minVersion": 0,
"package": "tester.mixin",
// The package storing mixin classes
"mixins": [
"MixinRunTester"
],
// Class name that relative to ${package}
"client": [],
// no effect
"server": []
// no effect
}In your Plugin Main Point add following code
public class MainPlugin {
private static void launch() throws Throwable {
Mixins.addConfiguration("myplugin/mixin/main.json");
}
}Example: MixinRunTester
JavaLangReflectInvokeEvent will broadcast when application invoking reflection of java.lang.reflect.
JavaLangReflectInvokeEvent.EVENT_LINE.register(EventPriority.NORMAL,event-> {
if (event.target instanceof Method) {
if (event.target.getDeclaringClass().getName().endsWith("EskPermissionDenied")) {
throw new IllegalAccessException("Permission Denied");
}
}
});When a new class before loading, a TransformBytecodeEvent will broadcast to event-pipeline.
Listen and modify TransformBytecodeEvent.bytecode to change bytecode with the lowest way.
The folder tester is a plugin for JvmHookFramework Testing. You can refer to it to write your own plugin.
JHF using SpongePowered/Configuration to manage configurations. Using it by
public class Main {
public static final File DATA_FOLDER = JvmHookFramework.getInstance().getDataFolder("my-plugin");
public static final HoconConfigurationLoader LOADER = JvmHookFramework.getInstance().newConfigLoader(
ConfigurationOptions.defaults()
.shouldCopyDefaults(true)
,
new File(DATA_FOLDER).toPath()
);
}