Skip to content

Commit 61d2785

Browse files
committed
Better Java 16 support, tries to get a super member to use instead of direct member
1 parent 69ce2f0 commit 61d2785

File tree

1 file changed

+49
-8
lines changed

1 file changed

+49
-8
lines changed

src/main/java/com/btk5h/skriptmirror/skript/reflect/ExprJavaCall.java

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
import com.btk5h.skriptmirror.ImportNotFoundException;
2020
import com.btk5h.skriptmirror.JavaCallException;
2121
import com.btk5h.skriptmirror.JavaType;
22-
import com.btk5h.skriptmirror.util.LRUCache;
2322
import com.btk5h.skriptmirror.Null;
2423
import com.btk5h.skriptmirror.ObjectWrapper;
2524
import com.btk5h.skriptmirror.skript.custom.CustomImport;
2625
import com.btk5h.skriptmirror.util.JavaUtil;
26+
import com.btk5h.skriptmirror.util.LRUCache;
2727
import com.btk5h.skriptmirror.util.SkriptMirrorUtil;
2828
import com.btk5h.skriptmirror.util.SkriptUtil;
2929
import com.btk5h.skriptmirror.util.StringSimilarity;
@@ -42,6 +42,7 @@
4242
import java.lang.reflect.Executable;
4343
import java.lang.reflect.Member;
4444
import java.lang.reflect.Method;
45+
import java.lang.reflect.Modifier;
4546
import java.lang.reflect.Parameter;
4647
import java.util.ArrayList;
4748
import java.util.Arrays;
@@ -370,7 +371,7 @@ private Collection<MethodHandle> createCallSite(Descriptor descriptor) {
370371

371372
JavaUtil.fields(javaClass)
372373
.filter(f -> f.getName().equals(descriptor.getName()))
373-
.map(ExprJavaCall::setAccessible)
374+
.map(ExprJavaCall::getAccess)
374375
.filter(Objects::nonNull)
375376
.forEach(field -> {
376377
try {
@@ -406,14 +407,14 @@ private Collection<MethodHandle> createCallSite(Descriptor descriptor) {
406407
}
407408

408409
return methodStream
409-
.map(ExprJavaCall::setAccessible)
410+
.map(ExprJavaCall::getAccess)
410411
.filter(Objects::nonNull)
411412
.map(JavaUtil.propagateErrors(LOOKUP::unreflect))
412413
.filter(Objects::nonNull)
413414
.collect(Collectors.toList());
414415
case CONSTRUCTOR:
415416
return JavaUtil.constructors(javaClass)
416-
.map(ExprJavaCall::setAccessible)
417+
.map(ExprJavaCall::getAccess)
417418
.filter(Objects::nonNull)
418419
.map(JavaUtil.propagateErrors(LOOKUP::unreflectConstructor))
419420
.filter(Objects::nonNull)
@@ -832,20 +833,60 @@ private static String argumentsToString(Object... arguments) {
832833
.collect(Collectors.joining(", "));
833834
}
834835

836+
@SuppressWarnings("unchecked")
835837
@Nullable
836-
private static <T extends AccessibleObject> T setAccessible(T t) {
838+
private static <T extends AccessibleObject> T getAccess(T member) {
837839
try {
838-
t.setAccessible(true);
839-
return t;
840+
member.setAccessible(true);
841+
return member;
840842
} catch (RuntimeException e) {
841843
// InaccessibleObjectException exists in Java 9+ only
842844
if (e instanceof SecurityException || e.getClass().getName().equals("java.lang.reflect.InaccessibleObjectException")) {
843-
return null;
845+
Member superMember = getSuperMember((Member) member);
846+
return superMember != null ? getAccess((T) superMember) : null;
844847
}
845848
throw e;
846849
}
847850
}
848851

852+
@Nullable
853+
private static Member getSuperMember(Member member) {
854+
if (!(member instanceof Executable))
855+
return null;
856+
Executable executable = (Executable) member;
857+
if ((executable.getModifiers() & Modifier.STATIC) != 0)
858+
return null;
859+
860+
return getSuperMember(executable, executable.getDeclaringClass());
861+
}
862+
863+
@Nullable
864+
private static Executable getSuperMember(Executable executable, Class<?> declaringClass) {
865+
List<Executable> executables = new ArrayList<>();
866+
executables.addAll(Arrays.asList(declaringClass.getDeclaredMethods()));
867+
executables.addAll(Arrays.asList(declaringClass.getDeclaredConstructors()));
868+
869+
if (executable.getDeclaringClass() != declaringClass)
870+
for (Executable loopExecutable : executables) {
871+
if (executable.getName().equals(loopExecutable.getName())
872+
&& Arrays.equals(executable.getParameterTypes(), loopExecutable.getParameterTypes())) {
873+
return loopExecutable;
874+
}
875+
}
876+
877+
List<Class<?>> superClasses = new ArrayList<>();
878+
superClasses.add(declaringClass.getSuperclass());
879+
superClasses.addAll(Arrays.asList(declaringClass.getInterfaces()));
880+
881+
for (Class<?> superClass : superClasses) {
882+
Executable superExecutable = getSuperMember(executable, superClass);
883+
if (superExecutable != null)
884+
return superExecutable;
885+
}
886+
887+
return null;
888+
}
889+
849890
@Override
850891
public String toString(Event e, boolean debug) {
851892
switch (type) {

0 commit comments

Comments
 (0)