Как можно использовать миксины для внедрения в лямбда-выражение [закрыто]JAVA

Программисты JAVA общаются здесь
Anonymous
Как можно использовать миксины для внедрения в лямбда-выражение [закрыто]

Сообщение Anonymous »

Я делаю мод Minecraft, и мне нужно добавить миксин, нацеленный на вызов метода внутри лямбда-тела.
У меня есть следующий целевой класс:

Код: Выделить всё

public class Foo {
public static void bar() {
Thread thread = new Thread(() -> {
System.out.println("Hello World!");
//Inject Here!
});
}
}
и у меня есть класс Mixin

Код: Выделить всё

@Mixin(Foo.class)
public abstract class FooMixin {
@Inject(
method = "lambda$bar$0()V",
at = @At(
value = "INVOKE",
target = "Ljava/io/PrintStream;println(Ljava/lang/String)"
shift = At.Shift.AFTER
))
public void doSomething(CallbackInfo ci) {
System.out.println("The mixin has succeeded")
}
}
Как должны выглядеть параметры at и метод?
Я знаю, что лямбды хранятся как методы в байт-коде под именем лямбда$method$X, но когда я попробовал это в параметре метода, Mixin не смог найти метод и выдал ошибку.
Вот трассировка стека:

Код: Выделить всё

[15:41:21] [Render thread/ERROR] (FabricLoader/Mixin) Mixin apply for mod pictureperfect failed pictureperfect.mixins.json:FooMixin from mod pictureperfect -> com.itsnukea.pictureperfect.Foo: org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException Error whilst instancing injection point org.spongepowered.asm.mixin.injection.points.BeforeInvoke for INVOKE [INJECT_PREPARE Applicator Phase -> pictureperfect.mixins.json:FooMixin from mod pictureperfect -> Prepare Injections -> handler$zdc000$pictureperfect$doSomething(Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V -> Parse ->  -> Parse Injection Points]
org.spongepowered.asm.mixin.injection.throwables.InvalidInjectionException: Error whilst instancing injection point org.spongepowered.asm.mixin.injection.points.BeforeInvoke for INVOKE [INJECT_PREPARE Applicator Phase -> pictureperfect.mixins.json:FooMixin from mod pictureperfect -> Prepare Injections -> handler$zdc000$pictureperfect$doSomething(Lorg/spongepowered/asm/mixin/injection/callback/CallbackInfo;)V -> Parse ->  ->  Parse Injection Points]
at org.spongepowered.asm.mixin.injection.InjectionPoint.create(InjectionPoint.java:876) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.InjectionPoint.parse(InjectionPoint.java:840) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.InjectionPoint.parse(InjectionPoint.java:788) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.InjectionPoint.parse(InjectionPoint.java:708) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parseInjectionPoints(InjectionInfo.java:439) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.readAnnotation(InjectionInfo.java:371) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.(InjectionInfo.java:340) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.(InjectionInfo.java:331) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.struct.CallbackInjectionInfo.(CallbackInjectionInfo.java:48) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[?:?]
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) ~[?:?]
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[?:?]
at org.spongepowered.asm.mixin.injection.struct.InjectionInfo$InjectorEntry.create(InjectionInfo.java:196) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.injection.struct.InjectionInfo.parse(InjectionInfo.java:664) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinTargetContext.prepareInjections(MixinTargetContext.java:1396) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.prepareInjections(MixinApplicatorStandard.java:731) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:315) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:246) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.TargetClassContext.apply(TargetClassContext.java:437) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:418) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:352) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:237) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:202) ~[sponge-mixin-0.17.0+mixin.0.8.7.jar:0.17.0+mixin.0.8.7]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:435) ~[fabric-loader-0.18.4.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.tryLoadClass(KnotClassDelegate.java:336) ~[fabric-loader-0.18.4.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassDelegate.loadClass(KnotClassDelegate.java:231) ~[fabric-loader-0.18.4.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:119) ~[fabric-loader-0.18.4.jar:?]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]
at knot/com.itsnukea.pictureperfect.PicturePerfect.onInitializeClient(PicturePerfect.java:24) ~[main/:?]
at net.fabricmc.loader.impl.FabricLoaderImpl.invokeEntrypoints(FabricLoaderImpl.java:405) [fabric-loader-0.18.4.jar:?]
at net.fabricmc.loader.impl.game.minecraft.Hooks.startClient(Hooks.java:53) [fabric-loader-0.18.4.jar:?]
at knot/net.minecraft.client.MinecraftClient.(MinecraftClient.java:483) [minecraft-merged-82357b8541-1.21.10-net.fabricmc.yarn.1_21_10.1.21.10+build.2-v2.jar:?]
at knot/net.minecraft.client.main.Main.main(Main.java:234)  [minecraft-merged-82357b8541-1.21.10-net.fabricmc.yarn.1_21_10.1.21.10+build.2-v2.jar:?]
at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:514) [fabric-loader-0.18.4.jar:?]
at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:72) [fabric-loader-0.18.4.jar:?]
at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23) [fabric-loader-0.18.4.jar:?]
at net.fabricmc.devlaunchinjector.Main.main(Main.java:86) [dev-launch-injector-0.2.1+build.8.jar:?]
Я не могу @Redirect или @ModifyArg лямбду, поскольку это почти наверняка вызовет проблемы совместимости с другими модами

Вернуться в «JAVA»