diff --git a/src/main/java/net/fabricmc/loader/impl/util/DefaultLanguageAdapter.java b/src/main/java/net/fabricmc/loader/impl/util/DefaultLanguageAdapter.java index 9e3318b1f..065a7c153 100644 --- a/src/main/java/net/fabricmc/loader/impl/util/DefaultLanguageAdapter.java +++ b/src/main/java/net/fabricmc/loader/impl/util/DefaultLanguageAdapter.java @@ -19,10 +19,13 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandleProxies; import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Executable; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import net.fabricmc.loader.api.LanguageAdapter; @@ -63,14 +66,20 @@ public T create(ModContainer mod, String value, Class type) throws Langua throw new LanguageAdapterException("Class " + c.getName() + " cannot be cast to " + type.getName() + "!"); } } else /* length == 2 */ { - List methodList = new ArrayList<>(); + List methodList = new ArrayList<>(); - for (Method m : c.getDeclaredMethods()) { - if (!(m.getName().equals(methodSplit[1]))) { - continue; - } + boolean isConstructor = methodSplit[1].equals(""); + + if(isConstructor) { + methodList.addAll(Arrays.asList(c.getDeclaredConstructors())); + } else { + for(Method m : c.getDeclaredMethods()) { + if(!(m.getName().equals(methodSplit[1]))) { + continue; + } - methodList.add(m); + methodList.add(m); + } } try { @@ -106,10 +115,10 @@ public T create(ModContainer mod, String value, Class type) throws Langua throw new LanguageAdapterException("Found multiple method entries of name " + value + "!"); } - final Method targetMethod = methodList.get(0); + final Executable targetMethod = methodList.get(0); Object object = null; - if ((targetMethod.getModifiers() & Modifier.STATIC) == 0) { + if ((targetMethod.getModifiers() & Modifier.STATIC) == 0 && !isConstructor) { try { object = c.getDeclaredConstructor().newInstance(); } catch (Exception e) { @@ -120,8 +129,11 @@ public T create(ModContainer mod, String value, Class type) throws Langua MethodHandle handle; try { - handle = MethodHandles.lookup() - .unreflect(targetMethod); + if(isConstructor) { + handle = MethodHandles.lookup().findConstructor(c, MethodType.methodType(void.class, targetMethod.getParameterTypes())); + } else { + handle = MethodHandles.lookup().unreflect((Method) targetMethod); + } } catch (Exception ex) { throw new LanguageAdapterException(ex); }