382 lines
13 KiB
Java
382 lines
13 KiB
Java
package com.unity3d.player;
|
|
|
|
import com.ijm.dataencryption.de.DataDecryptTool;
|
|
import com.ubt.jimu.base.util.FileUtil;
|
|
import java.lang.invoke.MethodHandles;
|
|
import java.lang.reflect.Array;
|
|
import java.lang.reflect.Constructor;
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.InvocationHandler;
|
|
import java.lang.reflect.Member;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Modifier;
|
|
import java.lang.reflect.Proxy;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
|
|
/* loaded from: classes2.dex */
|
|
final class ReflectionHelper {
|
|
protected static boolean LOG = false;
|
|
protected static final boolean LOGV = false;
|
|
private static a[] a = new a[FileUtil.ZIP_BUFFER_SIZE];
|
|
|
|
private static class a {
|
|
public volatile Member a;
|
|
private final Class b;
|
|
private final String c;
|
|
private final String d;
|
|
private final int e;
|
|
|
|
a(Class cls, String str, String str2) {
|
|
this.b = cls;
|
|
this.c = str;
|
|
this.d = str2;
|
|
this.e = ((((this.b.hashCode() + 527) * 31) + this.c.hashCode()) * 31) + this.d.hashCode();
|
|
}
|
|
|
|
public final boolean equals(Object obj) {
|
|
if (obj == this) {
|
|
return true;
|
|
}
|
|
if (obj instanceof a) {
|
|
a aVar = (a) obj;
|
|
if (this.e == aVar.e && this.d.equals(aVar.d) && this.c.equals(aVar.c) && this.b.equals(aVar.b)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public final int hashCode() {
|
|
return this.e;
|
|
}
|
|
}
|
|
|
|
ReflectionHelper() {
|
|
}
|
|
|
|
private static float a(Class cls, Class cls2) {
|
|
if (cls.equals(cls2)) {
|
|
return 1.0f;
|
|
}
|
|
if (cls.isPrimitive() || cls2.isPrimitive()) {
|
|
return 0.0f;
|
|
}
|
|
try {
|
|
if (cls.asSubclass(cls2) != null) {
|
|
return 0.5f;
|
|
}
|
|
} catch (ClassCastException unused) {
|
|
}
|
|
try {
|
|
return cls2.asSubclass(cls) != null ? 0.1f : 0.0f;
|
|
} catch (ClassCastException unused2) {
|
|
return 0.0f;
|
|
}
|
|
}
|
|
|
|
private static float a(Class cls, Class[] clsArr, Class[] clsArr2) {
|
|
if (clsArr2.length == 0) {
|
|
return 0.1f;
|
|
}
|
|
int i = 0;
|
|
if ((clsArr == null ? 0 : clsArr.length) + 1 != clsArr2.length) {
|
|
return 0.0f;
|
|
}
|
|
float f = 1.0f;
|
|
if (clsArr != null) {
|
|
int length = clsArr.length;
|
|
int i2 = 0;
|
|
while (i < length) {
|
|
f *= a(clsArr[i], clsArr2[i2]);
|
|
i++;
|
|
i2++;
|
|
}
|
|
}
|
|
return f * a(cls, clsArr2[clsArr2.length - 1]);
|
|
}
|
|
|
|
private static Class a(String str, int[] iArr) {
|
|
while (iArr[0] < str.length()) {
|
|
int i = iArr[0];
|
|
iArr[0] = i + 1;
|
|
char charAt = str.charAt(i);
|
|
if (charAt != '(' && charAt != ')') {
|
|
if (charAt == 'L') {
|
|
int indexOf = str.indexOf(59, iArr[0]);
|
|
if (indexOf == -1) {
|
|
return null;
|
|
}
|
|
String substring = str.substring(iArr[0], indexOf);
|
|
iArr[0] = indexOf + 1;
|
|
try {
|
|
return Class.forName(substring.replace('/', '.'));
|
|
} catch (ClassNotFoundException unused) {
|
|
return null;
|
|
}
|
|
}
|
|
if (charAt == 'Z') {
|
|
return Boolean.TYPE;
|
|
}
|
|
if (charAt == 'I') {
|
|
return Integer.TYPE;
|
|
}
|
|
if (charAt == 'F') {
|
|
return Float.TYPE;
|
|
}
|
|
if (charAt == 'V') {
|
|
return Void.TYPE;
|
|
}
|
|
if (charAt == 'B') {
|
|
return Byte.TYPE;
|
|
}
|
|
if (charAt == 'C') {
|
|
return Character.TYPE;
|
|
}
|
|
if (charAt == 'S') {
|
|
return Short.TYPE;
|
|
}
|
|
if (charAt == 'J') {
|
|
return Long.TYPE;
|
|
}
|
|
if (charAt == 'D') {
|
|
return Double.TYPE;
|
|
}
|
|
if (charAt == '[') {
|
|
return Array.newInstance((Class<?>) a(str, iArr), 0).getClass();
|
|
}
|
|
g.Log(5, "! parseType; " + charAt + " is not known!");
|
|
return null;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private static void a(a aVar, Member member) {
|
|
aVar.a = member;
|
|
a[aVar.hashCode() & (a.length - 1)] = aVar;
|
|
}
|
|
|
|
private static boolean a(a aVar) {
|
|
a aVar2 = a[aVar.hashCode() & (a.length - 1)];
|
|
if (!aVar.equals(aVar2)) {
|
|
return false;
|
|
}
|
|
aVar.a = aVar2.a;
|
|
return true;
|
|
}
|
|
|
|
private static Class[] a(String str) {
|
|
Class a2;
|
|
int i = 0;
|
|
int[] iArr = {0};
|
|
ArrayList arrayList = new ArrayList();
|
|
while (iArr[0] < str.length() && (a2 = a(str, iArr)) != null) {
|
|
arrayList.add(a2);
|
|
}
|
|
Class[] clsArr = new Class[arrayList.size()];
|
|
Iterator it = arrayList.iterator();
|
|
while (it.hasNext()) {
|
|
clsArr[i] = (Class) it.next();
|
|
i++;
|
|
}
|
|
return clsArr;
|
|
}
|
|
|
|
protected static Constructor getConstructorID(Class cls, String str) {
|
|
Constructor<?> constructor;
|
|
a aVar = new a(cls, "", str);
|
|
if (a(aVar)) {
|
|
constructor = (Constructor) aVar.a;
|
|
} else {
|
|
Class[] a2 = a(str);
|
|
float f = 0.0f;
|
|
Constructor<?> constructor2 = null;
|
|
for (Constructor<?> constructor3 : cls.getConstructors()) {
|
|
float a3 = a(Void.TYPE, constructor3.getParameterTypes(), a2);
|
|
if (a3 > f) {
|
|
constructor2 = constructor3;
|
|
if (a3 == 1.0f) {
|
|
break;
|
|
}
|
|
f = a3;
|
|
}
|
|
}
|
|
a(aVar, constructor2);
|
|
constructor = constructor2;
|
|
}
|
|
if (constructor != null) {
|
|
return constructor;
|
|
}
|
|
throw new NoSuchMethodError("<init>" + str + " in class " + cls.getName());
|
|
}
|
|
|
|
protected static Field getFieldID(Class cls, String str, String str2, boolean z) {
|
|
Field field;
|
|
Class cls2 = cls;
|
|
a aVar = new a(cls2, str, str2);
|
|
if (a(aVar)) {
|
|
field = (Field) aVar.a;
|
|
} else {
|
|
Class[] a2 = a(str2);
|
|
float f = 0.0f;
|
|
Field field2 = null;
|
|
while (cls2 != null) {
|
|
Field[] declaredFields = cls2.getDeclaredFields();
|
|
int length = declaredFields.length;
|
|
Field field3 = field2;
|
|
float f2 = f;
|
|
int i = 0;
|
|
while (true) {
|
|
if (i >= length) {
|
|
f = f2;
|
|
field2 = field3;
|
|
break;
|
|
}
|
|
Field field4 = declaredFields[i];
|
|
if (z == Modifier.isStatic(field4.getModifiers()) && field4.getName().compareTo(str) == 0) {
|
|
float a3 = a(field4.getType(), (Class[]) null, a2);
|
|
if (a3 > f2) {
|
|
if (a3 == 1.0f) {
|
|
field2 = field4;
|
|
f = a3;
|
|
break;
|
|
}
|
|
field3 = field4;
|
|
f2 = a3;
|
|
} else {
|
|
continue;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
if (f == 1.0f || cls2.isPrimitive() || cls2.isInterface() || cls2.equals(Object.class) || cls2.equals(Void.TYPE)) {
|
|
break;
|
|
}
|
|
cls2 = cls2.getSuperclass();
|
|
}
|
|
a(aVar, field2);
|
|
field = field2;
|
|
}
|
|
if (field != null) {
|
|
return field;
|
|
}
|
|
Object[] objArr = new Object[4];
|
|
objArr[0] = z ? "static" : "non-static";
|
|
objArr[1] = str;
|
|
objArr[2] = str2;
|
|
objArr[3] = cls2.getName();
|
|
throw new NoSuchFieldError(String.format("no %s field with name='%s' signature='%s' in class L%s;", objArr));
|
|
}
|
|
|
|
protected static Method getMethodID(Class cls, String str, String str2, boolean z) {
|
|
Method method;
|
|
a aVar = new a(cls, str, str2);
|
|
if (a(aVar)) {
|
|
method = (Method) aVar.a;
|
|
} else {
|
|
Class[] a2 = a(str2);
|
|
float f = 0.0f;
|
|
Method method2 = null;
|
|
while (cls != null) {
|
|
Method[] declaredMethods = cls.getDeclaredMethods();
|
|
int length = declaredMethods.length;
|
|
Method method3 = method2;
|
|
float f2 = f;
|
|
int i = 0;
|
|
while (true) {
|
|
if (i >= length) {
|
|
f = f2;
|
|
method2 = method3;
|
|
break;
|
|
}
|
|
Method method4 = declaredMethods[i];
|
|
if (z == Modifier.isStatic(method4.getModifiers()) && method4.getName().compareTo(str) == 0) {
|
|
float a3 = a(method4.getReturnType(), method4.getParameterTypes(), a2);
|
|
if (a3 > f2) {
|
|
if (a3 == 1.0f) {
|
|
method2 = method4;
|
|
f = a3;
|
|
break;
|
|
}
|
|
method3 = method4;
|
|
f2 = a3;
|
|
} else {
|
|
continue;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
if (f == 1.0f || cls.isPrimitive() || cls.isInterface() || cls.equals(Object.class) || cls.equals(Void.TYPE)) {
|
|
break;
|
|
}
|
|
cls = cls.getSuperclass();
|
|
}
|
|
a(aVar, method2);
|
|
method = method2;
|
|
}
|
|
if (method != null) {
|
|
return method;
|
|
}
|
|
Object[] objArr = new Object[4];
|
|
objArr[0] = z ? "static" : "non-static";
|
|
objArr[1] = str;
|
|
objArr[2] = str2;
|
|
objArr[3] = cls.getName();
|
|
throw new NoSuchMethodError(String.format("no %s method with name='%s' signature='%s' in class L%s;", objArr));
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static native void nativeProxyFinalize(int i);
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static native Object nativeProxyInvoke(int i, String str, Object[] objArr);
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public static native void nativeProxyLogJNIInvokeException();
|
|
|
|
protected static Object newProxyInstance(int i, Class cls) {
|
|
return newProxyInstance(i, new Class[]{cls});
|
|
}
|
|
|
|
protected static Object newProxyInstance(final int i, final Class[] clsArr) {
|
|
return Proxy.newProxyInstance(ReflectionHelper.class.getClassLoader(), clsArr, new InvocationHandler() { // from class: com.unity3d.player.ReflectionHelper.1
|
|
private static Object a(Object obj, Method method, Object[] objArr) {
|
|
if (objArr == null) {
|
|
try {
|
|
objArr = new Object[0];
|
|
} catch (NoClassDefFoundError unused) {
|
|
g.Log(6, String.format("Java interface default methods are only supported since Android Oreo", new Object[0]));
|
|
ReflectionHelper.nativeProxyLogJNIInvokeException();
|
|
return null;
|
|
}
|
|
}
|
|
Class<?> declaringClass = method.getDeclaringClass();
|
|
Constructor declaredConstructor = MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, Integer.TYPE);
|
|
declaredConstructor.setAccessible(true);
|
|
return ((MethodHandles.Lookup) declaredConstructor.newInstance(declaringClass, 2)).in(declaringClass).unreflectSpecial(method, declaringClass).bindTo(obj).invokeWithArguments(objArr);
|
|
}
|
|
|
|
protected final void finalize() {
|
|
try {
|
|
ReflectionHelper.nativeProxyFinalize(i);
|
|
} finally {
|
|
super.finalize();
|
|
}
|
|
}
|
|
|
|
@Override // java.lang.reflect.InvocationHandler
|
|
public final Object invoke(Object obj, Method method, Object[] objArr) {
|
|
Object nativeProxyInvoke = ReflectionHelper.nativeProxyInvoke(i, method.getName(), objArr);
|
|
if (nativeProxyInvoke == null) {
|
|
if ((method.getModifiers() & DataDecryptTool.DECRYPT_SP_FILE) == 0) {
|
|
return a(obj, method, objArr);
|
|
}
|
|
ReflectionHelper.nativeProxyLogJNIInvokeException();
|
|
}
|
|
return nativeProxyInvoke;
|
|
}
|
|
});
|
|
}
|
|
}
|