Primer paso de la investigacion. Se aportan el .apk, las carpetas con el apk extraido y el apk descompilado. El archivo API_DOCUMENTATION.md es un archivo donde se anotaran los descubrimientos del funcionamiento de la API, y los .py son scripts para probar la funcionalidad de la API con los métodos que vayamos encontrando. Finalmente, los archivos .js son scripts de Frida para extraer informacion de la APP durante la ejecucion.
This commit is contained in:
@@ -0,0 +1,265 @@
|
||||
package kotlin.reflect.jvm.internal;
|
||||
|
||||
import com.google.android.gms.measurement.api.AppMeasurementSdk;
|
||||
import com.google.firebase.analytics.FirebaseAnalytics;
|
||||
import com.google.firebase.messaging.Constants;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import kotlin.Lazy;
|
||||
import kotlin.LazyKt;
|
||||
import kotlin.LazyThreadSafetyMode;
|
||||
import kotlin.Metadata;
|
||||
import kotlin.Pair;
|
||||
import kotlin.Triple;
|
||||
import kotlin.collections.CollectionsKt;
|
||||
import kotlin.jvm.functions.Function0;
|
||||
import kotlin.jvm.internal.Intrinsics;
|
||||
import kotlin.jvm.internal.PropertyReference1Impl;
|
||||
import kotlin.jvm.internal.Reflection;
|
||||
import kotlin.jvm.internal.SourceDebugExtension;
|
||||
import kotlin.reflect.KCallable;
|
||||
import kotlin.reflect.KProperty;
|
||||
import kotlin.reflect.jvm.internal.KDeclarationContainerImpl;
|
||||
import kotlin.reflect.jvm.internal.KPackageImpl;
|
||||
import kotlin.reflect.jvm.internal.ReflectProperties;
|
||||
import kotlin.reflect.jvm.internal.impl.descriptors.ConstructorDescriptor;
|
||||
import kotlin.reflect.jvm.internal.impl.descriptors.FunctionDescriptor;
|
||||
import kotlin.reflect.jvm.internal.impl.descriptors.PropertyDescriptor;
|
||||
import kotlin.reflect.jvm.internal.impl.descriptors.runtime.components.ReflectKotlinClass;
|
||||
import kotlin.reflect.jvm.internal.impl.descriptors.runtime.structure.ReflectClassUtilKt;
|
||||
import kotlin.reflect.jvm.internal.impl.incremental.components.NoLookupLocation;
|
||||
import kotlin.reflect.jvm.internal.impl.load.kotlin.header.KotlinClassHeader;
|
||||
import kotlin.reflect.jvm.internal.impl.metadata.ProtoBuf;
|
||||
import kotlin.reflect.jvm.internal.impl.metadata.deserialization.ProtoBufUtilKt;
|
||||
import kotlin.reflect.jvm.internal.impl.metadata.deserialization.TypeTable;
|
||||
import kotlin.reflect.jvm.internal.impl.metadata.jvm.JvmProtoBuf;
|
||||
import kotlin.reflect.jvm.internal.impl.metadata.jvm.deserialization.JvmMetadataVersion;
|
||||
import kotlin.reflect.jvm.internal.impl.metadata.jvm.deserialization.JvmNameResolver;
|
||||
import kotlin.reflect.jvm.internal.impl.metadata.jvm.deserialization.JvmProtoBufUtil;
|
||||
import kotlin.reflect.jvm.internal.impl.name.Name;
|
||||
import kotlin.reflect.jvm.internal.impl.protobuf.GeneratedMessageLite;
|
||||
import kotlin.reflect.jvm.internal.impl.resolve.scopes.MemberScope;
|
||||
import kotlin.text.StringsKt__StringsJVMKt;
|
||||
|
||||
@Metadata(d1 = {"\u0000h\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u001e\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0010\u000b\n\u0000\n\u0002\u0010\u0000\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\b\n\u0002\b\u0003\n\u0002\u0010\u000e\n\u0002\b\u0002\b\u0000\u0018\u00002\u00020\u0001:\u0001(B\u0011\u0012\n\u0010\u0002\u001a\u0006\u0012\u0002\b\u00030\u0003¢\u0006\u0002\u0010\u0004J\u0013\u0010\u0018\u001a\u00020\u00192\b\u0010\u001a\u001a\u0004\u0018\u00010\u001bH\u0096\u0002J\u0016\u0010\u001c\u001a\b\u0012\u0004\u0012\u00020\u001d0\u00062\u0006\u0010\u001e\u001a\u00020\u001fH\u0016J\u0012\u0010 \u001a\u0004\u0018\u00010!2\u0006\u0010\"\u001a\u00020#H\u0016J\u0016\u0010$\u001a\b\u0012\u0004\u0012\u00020!0\u00062\u0006\u0010\u001e\u001a\u00020\u001fH\u0016J\b\u0010%\u001a\u00020#H\u0016J\b\u0010&\u001a\u00020'H\u0016R\u001a\u0010\u0005\u001a\b\u0012\u0004\u0012\u00020\u00070\u00068VX\u0096\u0004¢\u0006\u0006\u001a\u0004\b\b\u0010\tR\u0018\u0010\n\u001a\f\u0012\b\u0012\u00060\fR\u00020\u00000\u000bX\u0082\u0004¢\u0006\u0002\n\u0000R\u0018\u0010\u0002\u001a\u0006\u0012\u0002\b\u00030\u0003X\u0096\u0004¢\u0006\b\n\u0000\u001a\u0004\b\r\u0010\u000eR\u001e\u0010\u000f\u001a\f\u0012\b\u0012\u0006\u0012\u0002\b\u00030\u00100\u00068VX\u0096\u0004¢\u0006\u0006\u001a\u0004\b\u0011\u0010\tR\u0018\u0010\u0012\u001a\u0006\u0012\u0002\b\u00030\u00038TX\u0094\u0004¢\u0006\u0006\u001a\u0004\b\u0013\u0010\u000eR\u0014\u0010\u0014\u001a\u00020\u00158BX\u0082\u0004¢\u0006\u0006\u001a\u0004\b\u0016\u0010\u0017¨\u0006)"}, d2 = {"Lkotlin/reflect/jvm/internal/KPackageImpl;", "Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;", "jClass", "Ljava/lang/Class;", "(Ljava/lang/Class;)V", "constructorDescriptors", "", "Lkotlin/reflect/jvm/internal/impl/descriptors/ConstructorDescriptor;", "getConstructorDescriptors", "()Ljava/util/Collection;", Constants.ScionAnalytics.MessageType.DATA_MESSAGE, "Lkotlin/Lazy;", "Lkotlin/reflect/jvm/internal/KPackageImpl$Data;", "getJClass", "()Ljava/lang/Class;", "members", "Lkotlin/reflect/KCallable;", "getMembers", "methodOwner", "getMethodOwner", "scope", "Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;", "getScope", "()Lorg/jetbrains/kotlin/resolve/scopes/MemberScope;", "equals", "", "other", "", "getFunctions", "Lkotlin/reflect/jvm/internal/impl/descriptors/FunctionDescriptor;", AppMeasurementSdk.ConditionalUserProperty.NAME, "Lkotlin/reflect/jvm/internal/impl/name/Name;", "getLocalProperty", "Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor;", FirebaseAnalytics.Param.INDEX, "", "getProperties", "hashCode", "toString", "", "Data", "kotlin-reflection"}, k = 1, mv = {1, 9, 0}, xi = 48)
|
||||
@SourceDebugExtension({"SMAP\nKPackageImpl.kt\nKotlin\n*S Kotlin\n*F\n+ 1 KPackageImpl.kt\nkotlin/reflect/jvm/internal/KPackageImpl\n+ 2 fake.kt\nkotlin/jvm/internal/FakeKt\n*L\n1#1,117:1\n1#2:118\n*E\n"})
|
||||
/* loaded from: classes3.dex */
|
||||
public final class KPackageImpl extends KDeclarationContainerImpl {
|
||||
private final Lazy<Data> data;
|
||||
private final Class<?> jClass;
|
||||
|
||||
@Metadata(d1 = {"\u0000H\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0005\n\u0002\u0010\u001e\n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0005\n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\b\u0004\b\u0082\u0004\u0018\u00002\u00060\u0001R\u00020\u0002B\u0005¢\u0006\u0002\u0010\u0003R\u001d\u0010\u0004\u001a\u0004\u0018\u00010\u00058BX\u0082\u0084\u0002¢\u0006\f\n\u0004\b\b\u0010\t\u001a\u0004\b\u0006\u0010\u0007R%\u0010\n\u001a\f\u0012\b\u0012\u0006\u0012\u0002\b\u00030\f0\u000b8FX\u0086\u0084\u0002¢\u0006\f\n\u0004\b\u000f\u0010\t\u001a\u0004\b\r\u0010\u000eR/\u0010\u0010\u001a\u0016\u0012\u0004\u0012\u00020\u0012\u0012\u0004\u0012\u00020\u0013\u0012\u0004\u0012\u00020\u0014\u0018\u00010\u00118FX\u0086\u0084\u0002¢\u0006\f\n\u0004\b\u0017\u0010\u0018\u001a\u0004\b\u0015\u0010\u0016R!\u0010\u0019\u001a\b\u0012\u0002\b\u0003\u0018\u00010\u001a8FX\u0086\u0084\u0002¢\u0006\f\n\u0004\b\u001d\u0010\u0018\u001a\u0004\b\u001b\u0010\u001cR\u001b\u0010\u001e\u001a\u00020\u001f8FX\u0086\u0084\u0002¢\u0006\f\n\u0004\b\"\u0010\t\u001a\u0004\b \u0010!¨\u0006#"}, d2 = {"Lkotlin/reflect/jvm/internal/KPackageImpl$Data;", "Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl$Data;", "Lkotlin/reflect/jvm/internal/KDeclarationContainerImpl;", "(Lkotlin/reflect/jvm/internal/KPackageImpl;)V", "kotlinClass", "Lkotlin/reflect/jvm/internal/impl/descriptors/runtime/components/ReflectKotlinClass;", "getKotlinClass", "()Lorg/jetbrains/kotlin/descriptors/runtime/components/ReflectKotlinClass;", "kotlinClass$delegate", "Lkotlin/reflect/jvm/internal/ReflectProperties$LazySoftVal;", "members", "", "Lkotlin/reflect/jvm/internal/KCallableImpl;", "getMembers", "()Ljava/util/Collection;", "members$delegate", "metadata", "Lkotlin/Triple;", "Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolver;", "Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Package;", "Lkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmMetadataVersion;", "getMetadata", "()Lkotlin/Triple;", "metadata$delegate", "Lkotlin/Lazy;", "multifileFacade", "Ljava/lang/Class;", "getMultifileFacade", "()Ljava/lang/Class;", "multifileFacade$delegate", "scope", "Lkotlin/reflect/jvm/internal/impl/resolve/scopes/MemberScope;", "getScope", "()Lorg/jetbrains/kotlin/resolve/scopes/MemberScope;", "scope$delegate", "kotlin-reflection"}, k = 1, mv = {1, 9, 0}, xi = 48)
|
||||
/* loaded from: classes3.dex */
|
||||
public final class Data extends KDeclarationContainerImpl.Data {
|
||||
static final /* synthetic */ KProperty<Object>[] $$delegatedProperties = {Reflection.property1(new PropertyReference1Impl(Reflection.getOrCreateKotlinClass(Data.class), "kotlinClass", "getKotlinClass()Lorg/jetbrains/kotlin/descriptors/runtime/components/ReflectKotlinClass;")), Reflection.property1(new PropertyReference1Impl(Reflection.getOrCreateKotlinClass(Data.class), "scope", "getScope()Lorg/jetbrains/kotlin/resolve/scopes/MemberScope;")), Reflection.property1(new PropertyReference1Impl(Reflection.getOrCreateKotlinClass(Data.class), "members", "getMembers()Ljava/util/Collection;"))};
|
||||
|
||||
/* renamed from: kotlinClass$delegate, reason: from kotlin metadata */
|
||||
private final ReflectProperties.LazySoftVal kotlinClass;
|
||||
|
||||
/* renamed from: members$delegate, reason: from kotlin metadata */
|
||||
private final ReflectProperties.LazySoftVal members;
|
||||
|
||||
/* renamed from: metadata$delegate, reason: from kotlin metadata */
|
||||
private final Lazy metadata;
|
||||
|
||||
/* renamed from: multifileFacade$delegate, reason: from kotlin metadata */
|
||||
private final Lazy multifileFacade;
|
||||
|
||||
/* renamed from: scope$delegate, reason: from kotlin metadata */
|
||||
private final ReflectProperties.LazySoftVal scope;
|
||||
|
||||
public Data() {
|
||||
super();
|
||||
this.kotlinClass = ReflectProperties.lazySoft(new Function0<ReflectKotlinClass>() { // from class: kotlin.reflect.jvm.internal.KPackageImpl$Data$kotlinClass$2
|
||||
{
|
||||
super(0);
|
||||
}
|
||||
|
||||
@Override // kotlin.jvm.functions.Function0
|
||||
public final ReflectKotlinClass invoke() {
|
||||
return ReflectKotlinClass.Factory.create(KPackageImpl.this.getJClass());
|
||||
}
|
||||
});
|
||||
this.scope = ReflectProperties.lazySoft(new Function0<MemberScope>() { // from class: kotlin.reflect.jvm.internal.KPackageImpl$Data$scope$2
|
||||
{
|
||||
super(0);
|
||||
}
|
||||
|
||||
@Override // kotlin.jvm.functions.Function0
|
||||
public final MemberScope invoke() {
|
||||
ReflectKotlinClass kotlinClass;
|
||||
kotlinClass = KPackageImpl.Data.this.getKotlinClass();
|
||||
if (kotlinClass != null) {
|
||||
return KPackageImpl.Data.this.getModuleData().getPackagePartScopeCache().getPackagePartScope(kotlinClass);
|
||||
}
|
||||
return MemberScope.Empty.INSTANCE;
|
||||
}
|
||||
});
|
||||
LazyThreadSafetyMode lazyThreadSafetyMode = LazyThreadSafetyMode.PUBLICATION;
|
||||
this.multifileFacade = LazyKt.lazy(lazyThreadSafetyMode, (Function0) new Function0<Class<?>>() { // from class: kotlin.reflect.jvm.internal.KPackageImpl$Data$multifileFacade$2
|
||||
/* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
|
||||
{
|
||||
super(0);
|
||||
}
|
||||
|
||||
/* JADX WARN: Can't rename method to resolve collision */
|
||||
@Override // kotlin.jvm.functions.Function0
|
||||
public final Class<?> invoke() {
|
||||
ReflectKotlinClass kotlinClass;
|
||||
String replace$default;
|
||||
KotlinClassHeader classHeader;
|
||||
kotlinClass = KPackageImpl.Data.this.getKotlinClass();
|
||||
String multifileClassName = (kotlinClass == null || (classHeader = kotlinClass.getClassHeader()) == null) ? null : classHeader.getMultifileClassName();
|
||||
if (multifileClassName == null || multifileClassName.length() <= 0) {
|
||||
return null;
|
||||
}
|
||||
ClassLoader classLoader = r2.getJClass().getClassLoader();
|
||||
replace$default = StringsKt__StringsJVMKt.replace$default(multifileClassName, '/', '.', false, 4, (Object) null);
|
||||
return classLoader.loadClass(replace$default);
|
||||
}
|
||||
});
|
||||
this.metadata = LazyKt.lazy(lazyThreadSafetyMode, (Function0) new Function0<Triple<? extends JvmNameResolver, ? extends ProtoBuf.Package, ? extends JvmMetadataVersion>>() { // from class: kotlin.reflect.jvm.internal.KPackageImpl$Data$metadata$2
|
||||
{
|
||||
super(0);
|
||||
}
|
||||
|
||||
@Override // kotlin.jvm.functions.Function0
|
||||
public final Triple<? extends JvmNameResolver, ? extends ProtoBuf.Package, ? extends JvmMetadataVersion> invoke() {
|
||||
ReflectKotlinClass kotlinClass;
|
||||
KotlinClassHeader classHeader;
|
||||
kotlinClass = KPackageImpl.Data.this.getKotlinClass();
|
||||
if (kotlinClass != null && (classHeader = kotlinClass.getClassHeader()) != null) {
|
||||
String[] data = classHeader.getData();
|
||||
String[] strings = classHeader.getStrings();
|
||||
if (data != null && strings != null) {
|
||||
Pair<JvmNameResolver, ProtoBuf.Package> readPackageDataFrom = JvmProtoBufUtil.readPackageDataFrom(data, strings);
|
||||
return new Triple<>(readPackageDataFrom.component1(), readPackageDataFrom.component2(), classHeader.getMetadataVersion());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
this.members = ReflectProperties.lazySoft(new Function0<Collection<? extends KCallableImpl<?>>>() { // from class: kotlin.reflect.jvm.internal.KPackageImpl$Data$members$2
|
||||
/* JADX WARN: 'super' call moved to the top of the method (can break code semantics) */
|
||||
{
|
||||
super(0);
|
||||
}
|
||||
|
||||
@Override // kotlin.jvm.functions.Function0
|
||||
public final Collection<? extends KCallableImpl<?>> invoke() {
|
||||
return KPackageImpl.this.getMembers(this.getScope(), KDeclarationContainerImpl.MemberBelonginess.DECLARED);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/* JADX INFO: Access modifiers changed from: private */
|
||||
/* JADX WARN: Multi-variable type inference failed */
|
||||
public final ReflectKotlinClass getKotlinClass() {
|
||||
return (ReflectKotlinClass) this.kotlinClass.getValue(this, $$delegatedProperties[0]);
|
||||
}
|
||||
|
||||
public final Collection<KCallableImpl<?>> getMembers() {
|
||||
T value = this.members.getValue(this, $$delegatedProperties[2]);
|
||||
Intrinsics.checkNotNullExpressionValue(value, "getValue(...)");
|
||||
return (Collection) value;
|
||||
}
|
||||
|
||||
public final Triple<JvmNameResolver, ProtoBuf.Package, JvmMetadataVersion> getMetadata() {
|
||||
return (Triple) this.metadata.getValue();
|
||||
}
|
||||
|
||||
public final Class<?> getMultifileFacade() {
|
||||
return (Class) this.multifileFacade.getValue();
|
||||
}
|
||||
|
||||
public final MemberScope getScope() {
|
||||
T value = this.scope.getValue(this, $$delegatedProperties[1]);
|
||||
Intrinsics.checkNotNullExpressionValue(value, "getValue(...)");
|
||||
return (MemberScope) value;
|
||||
}
|
||||
}
|
||||
|
||||
public KPackageImpl(Class<?> jClass) {
|
||||
Intrinsics.checkNotNullParameter(jClass, "jClass");
|
||||
this.jClass = jClass;
|
||||
this.data = LazyKt.lazy(LazyThreadSafetyMode.PUBLICATION, (Function0) new Function0<Data>() { // from class: kotlin.reflect.jvm.internal.KPackageImpl$data$1
|
||||
{
|
||||
super(0);
|
||||
}
|
||||
|
||||
@Override // kotlin.jvm.functions.Function0
|
||||
public final KPackageImpl.Data invoke() {
|
||||
return new KPackageImpl.Data();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private final MemberScope getScope() {
|
||||
return this.data.getValue().getScope();
|
||||
}
|
||||
|
||||
public boolean equals(Object other) {
|
||||
return (other instanceof KPackageImpl) && Intrinsics.areEqual(getJClass(), ((KPackageImpl) other).getJClass());
|
||||
}
|
||||
|
||||
@Override // kotlin.reflect.jvm.internal.KDeclarationContainerImpl
|
||||
public Collection<ConstructorDescriptor> getConstructorDescriptors() {
|
||||
return CollectionsKt.emptyList();
|
||||
}
|
||||
|
||||
@Override // kotlin.reflect.jvm.internal.KDeclarationContainerImpl
|
||||
public Collection<FunctionDescriptor> getFunctions(Name name) {
|
||||
Intrinsics.checkNotNullParameter(name, "name");
|
||||
return getScope().getContributedFunctions(name, NoLookupLocation.FROM_REFLECTION);
|
||||
}
|
||||
|
||||
@Override // kotlin.jvm.internal.ClassBasedDeclarationContainer
|
||||
public Class<?> getJClass() {
|
||||
return this.jClass;
|
||||
}
|
||||
|
||||
@Override // kotlin.reflect.jvm.internal.KDeclarationContainerImpl
|
||||
public PropertyDescriptor getLocalProperty(int index) {
|
||||
Triple<JvmNameResolver, ProtoBuf.Package, JvmMetadataVersion> metadata = this.data.getValue().getMetadata();
|
||||
if (metadata != null) {
|
||||
JvmNameResolver component1 = metadata.component1();
|
||||
ProtoBuf.Package component2 = metadata.component2();
|
||||
JvmMetadataVersion component3 = metadata.component3();
|
||||
GeneratedMessageLite.GeneratedExtension<ProtoBuf.Package, List<ProtoBuf.Property>> packageLocalVariable = JvmProtoBuf.packageLocalVariable;
|
||||
Intrinsics.checkNotNullExpressionValue(packageLocalVariable, "packageLocalVariable");
|
||||
ProtoBuf.Property property = (ProtoBuf.Property) ProtoBufUtilKt.getExtensionOrNull(component2, packageLocalVariable, index);
|
||||
if (property != null) {
|
||||
Class<?> jClass = getJClass();
|
||||
ProtoBuf.TypeTable typeTable = component2.getTypeTable();
|
||||
Intrinsics.checkNotNullExpressionValue(typeTable, "getTypeTable(...)");
|
||||
return (PropertyDescriptor) UtilKt.deserializeToDescriptor(jClass, property, component1, new TypeTable(typeTable), component3, KPackageImpl$getLocalProperty$1$1$1.INSTANCE);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override // kotlin.reflect.KDeclarationContainer
|
||||
public Collection<KCallable<?>> getMembers() {
|
||||
return this.data.getValue().getMembers();
|
||||
}
|
||||
|
||||
@Override // kotlin.reflect.jvm.internal.KDeclarationContainerImpl
|
||||
public Class<?> getMethodOwner() {
|
||||
Class<?> multifileFacade = this.data.getValue().getMultifileFacade();
|
||||
return multifileFacade == null ? getJClass() : multifileFacade;
|
||||
}
|
||||
|
||||
@Override // kotlin.reflect.jvm.internal.KDeclarationContainerImpl
|
||||
public Collection<PropertyDescriptor> getProperties(Name name) {
|
||||
Intrinsics.checkNotNullParameter(name, "name");
|
||||
return getScope().getContributedVariables(name, NoLookupLocation.FROM_REFLECTION);
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return getJClass().hashCode();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "file class " + ReflectClassUtilKt.getClassId(getJClass()).asSingleFqName();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user