为了在内联方法中使用它们而混淆对优先私有但实际上 public class 成员的访问的方法
Ways to obfuscate access to prefereably private, but actually public class members for the sake of using them in inline methods
有哪些方法可以混淆或限制对 class 的 public 成员的访问?
这样做的动机是我希望能够inline
一个方法,但是它需要访问class中的其他成员,这要求他们是[=14] =],但我更希望这些成员不是 public
,但由于它们必须是 public
,我正在寻找混淆或限制对它们的访问的方法。
这是我希望 preferablyPrivateLock
私有化的例子:
class SomeClass
{
val preferablyPrivateLock = ReentrantLock()
inline fun <R> fancyInlineFunction(function:()->R):R
{
preferablyPrivateLock.lock()
try
{
return function()
}
finally
{
preferablyPrivateLock.unlock()
}
}
}
P.S。我知道这似乎是糟糕的 OO 设计;希望这个问题不会让我失去任何声誉...
这是一种在 extensions 的帮助下混淆对 preferablyPrivateLock
的访问的方法:
class SomeClass
{
private val preferablyPrivateLock = ReentrantLock()
val Unit.obfuscatedLock:ReentrantLock
get() = preferablyPrivateLock
inline fun <R> fancyInlineFunction(function:()->R):R
{
with(this) {Unit.obfuscatedLock}.lock()
try
{
return function()
}
finally
{
with(this) {Unit.obfuscatedLock}.unlock()
}
}
}
同样可以在没有 Unit
的情况下完成,方法是将方法作为其自身的扩展 class,在本例中为 SomeClass
。这简化了用法:
class SomeClass
{
private val preferablyPrivateLock = ReentrantLock()
val SomeClass.hiddenLock: ReentrantLock
get() = preferablyPrivateLock
inline fun <R> fancyInlineFunction(function:()->R):R
{
with(this) { hiddenLock }.lock()
try
{
return function()
}
finally
{
with(this) { hiddenLock }.unlock()
}
}
}
class OtherClass {
fun foo() {
val x = SomeClass().hiddenLock // ERROR: Unresolved reference hiddenLock
}
}
@Kirill 在 Kotlin Slack 中提到了这个解决方案。这是与此类似的技术:
有哪些方法可以混淆或限制对 class 的 public 成员的访问?
这样做的动机是我希望能够inline
一个方法,但是它需要访问class中的其他成员,这要求他们是[=14] =],但我更希望这些成员不是 public
,但由于它们必须是 public
,我正在寻找混淆或限制对它们的访问的方法。
这是我希望 preferablyPrivateLock
私有化的例子:
class SomeClass
{
val preferablyPrivateLock = ReentrantLock()
inline fun <R> fancyInlineFunction(function:()->R):R
{
preferablyPrivateLock.lock()
try
{
return function()
}
finally
{
preferablyPrivateLock.unlock()
}
}
}
P.S。我知道这似乎是糟糕的 OO 设计;希望这个问题不会让我失去任何声誉...
这是一种在 extensions 的帮助下混淆对 preferablyPrivateLock
的访问的方法:
class SomeClass
{
private val preferablyPrivateLock = ReentrantLock()
val Unit.obfuscatedLock:ReentrantLock
get() = preferablyPrivateLock
inline fun <R> fancyInlineFunction(function:()->R):R
{
with(this) {Unit.obfuscatedLock}.lock()
try
{
return function()
}
finally
{
with(this) {Unit.obfuscatedLock}.unlock()
}
}
}
同样可以在没有 Unit
的情况下完成,方法是将方法作为其自身的扩展 class,在本例中为 SomeClass
。这简化了用法:
class SomeClass
{
private val preferablyPrivateLock = ReentrantLock()
val SomeClass.hiddenLock: ReentrantLock
get() = preferablyPrivateLock
inline fun <R> fancyInlineFunction(function:()->R):R
{
with(this) { hiddenLock }.lock()
try
{
return function()
}
finally
{
with(this) { hiddenLock }.unlock()
}
}
}
class OtherClass {
fun foo() {
val x = SomeClass().hiddenLock // ERROR: Unresolved reference hiddenLock
}
}
@Kirill 在 Kotlin Slack 中提到了这个解决方案。这是与此类似的技术: