diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/property/privateClassVal.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/property/privateClassVal.kt index a762b05c1df..74399986a8f 100644 --- a/compiler/testData/codegen/boxWithStdlib/callableReference/property/privateClassVal.kt +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/property/privateClassVal.kt @@ -1,3 +1,4 @@ +import kotlin.reflect.IllegalAccessException import kotlin.reflect.KMemberProperty import kotlin.reflect.jvm.accessible diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/property/privateClassVar.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/property/privateClassVar.kt index 19a42534cb0..42fde2a640f 100644 --- a/compiler/testData/codegen/boxWithStdlib/callableReference/property/privateClassVar.kt +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/property/privateClassVar.kt @@ -1,3 +1,4 @@ +import kotlin.reflect.IllegalAccessException import kotlin.reflect.KMutableMemberProperty import kotlin.reflect.jvm.accessible diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/property/protectedClassVar.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/property/protectedClassVar.kt index 112038072a4..35237e8c153 100644 --- a/compiler/testData/codegen/boxWithStdlib/callableReference/property/protectedClassVar.kt +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/property/protectedClassVar.kt @@ -1,3 +1,4 @@ +import kotlin.reflect.IllegalAccessException import kotlin.reflect.jvm.accessible class A(param: String) { diff --git a/core/runtime.jvm/src/kotlin/reflect/exceptions.kt b/core/runtime.jvm/src/kotlin/reflect/exceptions.kt new file mode 100644 index 00000000000..141196da129 --- /dev/null +++ b/core/runtime.jvm/src/kotlin/reflect/exceptions.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package kotlin.reflect + +suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") +public class IllegalAccessException(cause: java.lang.IllegalAccessException) : Exception() { + { + (this as java.lang.Throwable).initCause(cause) + } +} + +suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN") +public class NoSuchPropertyException(cause: Exception) : Exception() { + { + (this as java.lang.Throwable).initCause(cause) + } +} diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KForeignMemberProperty.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KForeignMemberProperty.kt index ef62750475c..50b0541b1d8 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KForeignMemberProperty.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KForeignMemberProperty.kt @@ -23,12 +23,22 @@ open class KForeignMemberProperty( public override val name: String, protected val owner: KClassImpl ) : KMemberProperty, KPropertyImpl { - override val field: Field = owner.jClass.getField(name) + override val field: Field = try { + owner.jClass.getField(name) + } + catch (e: NoSuchFieldException) { + throw NoSuchPropertyException(e) + } override val getter: Method? get() = null override fun get(receiver: T): R { - return field.get(receiver) as R + try { + return field.get(receiver) as R + } + catch (e: java.lang.IllegalAccessException) { + throw kotlin.reflect.IllegalAccessException(e) + } } override fun equals(other: Any?): Boolean = @@ -49,7 +59,12 @@ class KMutableForeignMemberProperty( override val setter: Method? get() = null override fun set(receiver: T, value: R) { - field.set(receiver, value) + try { + field.set(receiver, value) + } + catch (e: java.lang.IllegalAccessException) { + throw kotlin.reflect.IllegalAccessException(e) + } } override fun toString(): String = diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt index b6196ed9a50..bd19fe400b2 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KMemberPropertyImpl.kt @@ -34,10 +34,20 @@ open class KMemberPropertyImpl( } // TODO: extract, make lazy (weak?), use our descriptors knowledge - override val getter: Method = owner.jClass.getMaybeDeclaredMethod(getterName(name)) + override val getter: Method = try { + owner.jClass.getMaybeDeclaredMethod(getterName(name)) + } + catch (e: NoSuchMethodException) { + throw NoSuchPropertyException(e) + } override fun get(receiver: T): R { - return getter(receiver) as R + try { + return getter(receiver) as R + } + catch (e: java.lang.IllegalAccessException) { + throw kotlin.reflect.IllegalAccessException(e) + } } override fun equals(other: Any?): Boolean = @@ -55,10 +65,20 @@ class KMutableMemberPropertyImpl( name: String, owner: KClassImpl ) : KMutableMemberProperty, KMutablePropertyImpl, KMemberPropertyImpl(name, owner) { - override val setter: Method = owner.jClass.getMaybeDeclaredMethod(setterName(name), getter.getReturnType()!!) + override val setter: Method = try { + owner.jClass.getMaybeDeclaredMethod(setterName(name), getter.getReturnType()!!) + } + catch (e: NoSuchMethodException) { + throw NoSuchPropertyException(e) + } override fun set(receiver: T, value: R) { - setter(receiver, value) + try { + setter(receiver, value) + } + catch (e: java.lang.IllegalAccessException) { + throw kotlin.reflect.IllegalAccessException(e) + } } override fun toString(): String = diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt index d200c100f2e..e60ecc9ae20 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelExtensionPropertyImpl.kt @@ -27,10 +27,20 @@ open class KTopLevelExtensionPropertyImpl( override val field: Field? get() = null // TODO: extract, make lazy (weak?), use our descriptors knowledge, support Java fields - override val getter: Method = owner.jClass.getMethod(getterName(name), receiverClass) + override val getter: Method = try { + owner.jClass.getMethod(getterName(name), receiverClass) + } + catch (e: NoSuchMethodException) { + throw NoSuchPropertyException(e) + } override fun get(receiver: T): R { - return getter(null, receiver) as R + try { + return getter(null, receiver) as R + } + catch (e: java.lang.IllegalAccessException) { + throw kotlin.reflect.IllegalAccessException(e) + } } override fun equals(other: Any?): Boolean = @@ -49,10 +59,20 @@ class KMutableTopLevelExtensionPropertyImpl( owner: KPackageImpl, receiverClass: Class ) : KMutableTopLevelExtensionProperty, KMutablePropertyImpl, KTopLevelExtensionPropertyImpl(name, owner, receiverClass) { - override val setter: Method = owner.jClass.getMethod(setterName(name), receiverClass, getter.getReturnType()!!) + override val setter: Method = try { + owner.jClass.getMethod(setterName(name), receiverClass, getter.getReturnType()!!) + } + catch (e: NoSuchMethodException) { + throw NoSuchPropertyException(e) + } override fun set(receiver: T, value: R) { - setter.invoke(null, receiver, value) + try { + setter.invoke(null, receiver, value) + } + catch (e: java.lang.IllegalAccessException) { + throw kotlin.reflect.IllegalAccessException(e) + } } override fun toString(): String = diff --git a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt index d88bb73491e..8fa6a06609b 100644 --- a/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt +++ b/core/runtime.jvm/src/kotlin/reflect/jvm/internal/KTopLevelVariableImpl.kt @@ -27,10 +27,20 @@ open class KTopLevelVariableImpl( override val field: Field? get() = null // TODO: extract, make lazy (weak?), use our descriptors knowledge, support Java fields - override val getter: Method = owner.jClass.getMethod(getterName(name)) + override val getter: Method = try { + owner.jClass.getMethod(getterName(name)) + } + catch (e: NoSuchMethodException) { + throw NoSuchPropertyException(e) + } override fun get(): R { - return getter(null) as R + try { + return getter(null) as R + } + catch (e: java.lang.IllegalAccessException) { + throw kotlin.reflect.IllegalAccessException(e) + } } override fun equals(other: Any?): Boolean = @@ -48,10 +58,20 @@ class KMutableTopLevelVariableImpl( name: String, owner: KPackageImpl ) : KMutableTopLevelVariable, KMutableVariableImpl, KTopLevelVariableImpl(name, owner) { - override val setter: Method = owner.jClass.getMethod(setterName(name), getter.getReturnType()!!) + override val setter: Method = try { + owner.jClass.getMethod(setterName(name), getter.getReturnType()!!) + } + catch (e: NoSuchMethodException) { + throw NoSuchPropertyException(e) + } override fun set(value: R) { - setter.invoke(null, value) + try { + setter.invoke(null, value) + } + catch (e: java.lang.IllegalAccessException) { + throw kotlin.reflect.IllegalAccessException(e) + } } override fun toString(): String =