Rename and implement KProperty.accessible -> KCallable.isAccessible
This commit is contained in:
+15
@@ -0,0 +1,15 @@
|
|||||||
|
import kotlin.reflect.jvm.*
|
||||||
|
|
||||||
|
enum class E
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
try {
|
||||||
|
val c = E::class.constructors.single()
|
||||||
|
c.isAccessible = true
|
||||||
|
c.call()
|
||||||
|
return "Fail: constructing an enum class should not be allowed"
|
||||||
|
}
|
||||||
|
catch (e: Throwable) {
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ fun box(): String {
|
|||||||
val a = A("abc")
|
val a = A("abc")
|
||||||
|
|
||||||
val p = A::class.declaredMemberProperties.single() as KMutableProperty1<A, String>
|
val p = A::class.declaredMemberProperties.single() as KMutableProperty1<A, String>
|
||||||
p.accessible = true
|
p.isAccessible = true
|
||||||
assertEquals("abc", p.call(a))
|
assertEquals("abc", p.call(a))
|
||||||
assertEquals(Unit, p.setter.call(a, "def"))
|
assertEquals(Unit, p.setter.call(a, "def"))
|
||||||
assertEquals("def", p.getter.call(a))
|
assertEquals("def", p.getter.call(a))
|
||||||
|
|||||||
+1
-1
@@ -13,7 +13,7 @@ fun box(): String {
|
|||||||
// OK
|
// OK
|
||||||
}
|
}
|
||||||
|
|
||||||
p.accessible = true
|
p.isAccessible = true
|
||||||
|
|
||||||
return p.get(K("OK"))
|
return p.get(K("OK"))
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -1,5 +1,5 @@
|
|||||||
import kotlin.reflect.*
|
import kotlin.reflect.*
|
||||||
import kotlin.reflect.jvm.accessible
|
import kotlin.reflect.jvm.isAccessible
|
||||||
|
|
||||||
class Result {
|
class Result {
|
||||||
private val value = "OK"
|
private val value = "OK"
|
||||||
@@ -14,11 +14,11 @@ fun box(): String {
|
|||||||
return "Fail: private property is accessible by default"
|
return "Fail: private property is accessible by default"
|
||||||
} catch(e: IllegalPropertyAccessException) { }
|
} catch(e: IllegalPropertyAccessException) { }
|
||||||
|
|
||||||
p.accessible = true
|
p.isAccessible = true
|
||||||
|
|
||||||
val r = p.get(Result())
|
val r = p.get(Result())
|
||||||
|
|
||||||
p.accessible = false
|
p.isAccessible = false
|
||||||
try {
|
try {
|
||||||
p.get(Result())
|
p.get(Result())
|
||||||
return "Fail: setAccessible(false) had no effect"
|
return "Fail: setAccessible(false) had no effect"
|
||||||
|
|||||||
+3
-3
@@ -1,5 +1,5 @@
|
|||||||
import kotlin.reflect.*
|
import kotlin.reflect.*
|
||||||
import kotlin.reflect.jvm.accessible
|
import kotlin.reflect.jvm.isAccessible
|
||||||
|
|
||||||
class A {
|
class A {
|
||||||
private var value = 0
|
private var value = 0
|
||||||
@@ -15,12 +15,12 @@ fun box(): String {
|
|||||||
return "Fail: private property is accessible by default"
|
return "Fail: private property is accessible by default"
|
||||||
} catch(e: IllegalPropertyAccessException) { }
|
} catch(e: IllegalPropertyAccessException) { }
|
||||||
|
|
||||||
p.accessible = true
|
p.isAccessible = true
|
||||||
|
|
||||||
p.set(a, 2)
|
p.set(a, 2)
|
||||||
p.get(a)
|
p.get(a)
|
||||||
|
|
||||||
p.accessible = false
|
p.isAccessible = false
|
||||||
try {
|
try {
|
||||||
p.set(a, 3)
|
p.set(a, 3)
|
||||||
return "Fail: setAccessible(false) had no effect"
|
return "Fail: setAccessible(false) had no effect"
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ class K<in T : String> {
|
|||||||
|
|
||||||
fun run(): String {
|
fun run(): String {
|
||||||
val p = ::t
|
val p = ::t
|
||||||
p.accessible = true
|
p.isAccessible = true
|
||||||
p.set(this, "" as T)
|
p.set(this, "" as T)
|
||||||
return p.get(this)
|
return p.get(this)
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
import kotlin.reflect.*
|
import kotlin.reflect.*
|
||||||
import kotlin.reflect.jvm.accessible
|
import kotlin.reflect.jvm.isAccessible
|
||||||
|
|
||||||
class A(param: String) {
|
class A(param: String) {
|
||||||
protected var v: String = param
|
protected var v: String = param
|
||||||
@@ -21,7 +21,7 @@ fun box(): String {
|
|||||||
return "Fail: protected property setter is accessible by default"
|
return "Fail: protected property setter is accessible by default"
|
||||||
} catch (e: IllegalPropertyAccessException) { }
|
} catch (e: IllegalPropertyAccessException) { }
|
||||||
|
|
||||||
f.accessible = true
|
f.isAccessible = true
|
||||||
|
|
||||||
f.set(a, ":)")
|
f.set(a, ":)")
|
||||||
|
|
||||||
|
|||||||
+6
@@ -2775,6 +2775,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
|
|||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/reflection/call"), Pattern.compile("^(.+)\\.kt$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/reflection/call"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("cannotCallEnumConstructor.kt")
|
||||||
|
public void testCannotCallEnumConstructor() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/call/cannotCallEnumConstructor.kt");
|
||||||
|
doTestWithStdlib(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("equalsHashCodeToString.kt")
|
@TestMetadata("equalsHashCodeToString.kt")
|
||||||
public void testEqualsHashCodeToString() throws Exception {
|
public void testEqualsHashCodeToString() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/call/equalsHashCodeToString.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/reflection/call/equalsHashCodeToString.kt");
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ package kotlin.reflect
|
|||||||
*
|
*
|
||||||
* @param cause the original exception thrown by the JVM.
|
* @param cause the original exception thrown by the JVM.
|
||||||
*
|
*
|
||||||
* @see [kotlin.reflect.jvm.accessible]
|
* @see [kotlin.reflect.jvm.isAccessible]
|
||||||
*/
|
*/
|
||||||
public class IllegalPropertyAccessException(cause: IllegalAccessException) : Exception(cause.getMessage()) {
|
public class IllegalPropertyAccessException(cause: IllegalAccessException) : Exception(cause.getMessage()) {
|
||||||
init {
|
init {
|
||||||
|
|||||||
@@ -39,3 +39,9 @@ public val <T> KClass<T>.declaredProperties: Collection<KProperty1<T, *>>
|
|||||||
@deprecated("Use declaredMemberExtensionProperties instead.", ReplaceWith("declaredMemberExtensionProperties"))
|
@deprecated("Use declaredMemberExtensionProperties instead.", ReplaceWith("declaredMemberExtensionProperties"))
|
||||||
public val <T> KClass<T>.declaredExtensionProperties: Collection<KProperty2<T, *, *>>
|
public val <T> KClass<T>.declaredExtensionProperties: Collection<KProperty2<T, *, *>>
|
||||||
get() = declaredMemberExtensionProperties
|
get() = declaredMemberExtensionProperties
|
||||||
|
|
||||||
|
|
||||||
|
@deprecated("Use isAccessible instead.", ReplaceWith("isAccessible"))
|
||||||
|
public var KProperty<*>.accessible: Boolean
|
||||||
|
get() = isAccessible
|
||||||
|
set(value) { isAccessible = value }
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 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.jvm
|
||||||
|
|
||||||
|
import kotlin.reflect.KCallable
|
||||||
|
import kotlin.reflect.KFunction
|
||||||
|
import kotlin.reflect.KMutableProperty
|
||||||
|
import kotlin.reflect.KProperty
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a way to suppress JVM access checks for a callable.
|
||||||
|
*
|
||||||
|
* @getter returns `true` if JVM access checks are suppressed for this callable object.
|
||||||
|
* For a property, that means that all its accessors (getter, and setter for `var` properties) are accessible.
|
||||||
|
*
|
||||||
|
* @setter if set to `true`, suppresses JVM access checks for this callable object.
|
||||||
|
* For a property, both accessors are made accessible.
|
||||||
|
*
|
||||||
|
* @see [java.lang.reflect.AccessibleObject]
|
||||||
|
*/
|
||||||
|
public var KCallable<*>.isAccessible: Boolean
|
||||||
|
get() {
|
||||||
|
return when (this) {
|
||||||
|
is KMutableProperty ->
|
||||||
|
javaField?.isAccessible ?: true &&
|
||||||
|
javaGetter?.isAccessible ?: true &&
|
||||||
|
javaSetter?.isAccessible ?: true
|
||||||
|
is KProperty ->
|
||||||
|
javaField?.isAccessible ?: true &&
|
||||||
|
javaGetter?.isAccessible ?: true
|
||||||
|
is KFunction ->
|
||||||
|
javaMethod?.isAccessible ?: true &&
|
||||||
|
this.javaConstructor?.isAccessible ?: true
|
||||||
|
else -> throw UnsupportedOperationException("Unknown callable: $this ($javaClass)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set(value) {
|
||||||
|
when (this) {
|
||||||
|
is KMutableProperty -> {
|
||||||
|
javaField?.isAccessible = value
|
||||||
|
javaGetter?.isAccessible = value
|
||||||
|
javaSetter?.isAccessible = value
|
||||||
|
}
|
||||||
|
is KProperty -> {
|
||||||
|
javaField?.isAccessible = value
|
||||||
|
javaGetter?.isAccessible = value
|
||||||
|
}
|
||||||
|
is KFunction -> {
|
||||||
|
javaMethod?.isAccessible = value
|
||||||
|
this.javaConstructor?.isAccessible = value
|
||||||
|
}
|
||||||
|
else -> throw UnsupportedOperationException("Unknown callable: $this ($javaClass)")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2015 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.jvm
|
|
||||||
|
|
||||||
import kotlin.reflect.KProperty
|
|
||||||
import kotlin.reflect.jvm.internal.KMutablePropertyImpl
|
|
||||||
import kotlin.reflect.jvm.internal.KPropertyImpl
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provides a way to suppress JVM access checks for a property.
|
|
||||||
*
|
|
||||||
* @getter returns `true` if JVM access checks are suppressed for this property object.
|
|
||||||
* In case of a `var` property, that means that both getter and setter are accessible.
|
|
||||||
*
|
|
||||||
* @setter if set to `true`, suppresses JVM access checks for this property object.
|
|
||||||
* In case of a `var` property, both getter and setter are made accessible.
|
|
||||||
*
|
|
||||||
* @see [java.lang.reflect.AccessibleObject]
|
|
||||||
*/
|
|
||||||
public var <R> KProperty<R>.accessible: Boolean
|
|
||||||
get() {
|
|
||||||
return when (this) {
|
|
||||||
is KMutablePropertyImpl<R> ->
|
|
||||||
javaField?.isAccessible() ?: true &&
|
|
||||||
javaGetter?.isAccessible() ?: true &&
|
|
||||||
javaSetter?.isAccessible() ?: true
|
|
||||||
is KPropertyImpl<R> ->
|
|
||||||
javaField?.isAccessible() ?: true &&
|
|
||||||
javaGetter?.isAccessible() ?: true
|
|
||||||
else -> throw UnsupportedOperationException("Unknown property: $this ($javaClass)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
set(value) {
|
|
||||||
when (this) {
|
|
||||||
is KMutablePropertyImpl<R> -> {
|
|
||||||
javaField?.setAccessible(value)
|
|
||||||
javaGetter?.setAccessible(value)
|
|
||||||
javaSetter?.setAccessible(value)
|
|
||||||
}
|
|
||||||
is KPropertyImpl<R> -> {
|
|
||||||
javaField?.setAccessible(value)
|
|
||||||
javaGetter?.setAccessible(value)
|
|
||||||
}
|
|
||||||
else -> throw UnsupportedOperationException("Unknown property: $this ($javaClass)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user