Coverage Summary for Class: Foo (dev.suresh.lang)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
Foo |
0%
(0/1)
|
|
0%
(0/1)
|
Foo$Companion |
0%
(0/1)
|
|
0%
(0/2)
|
0%
(0/12)
|
Total |
0%
(0/2)
|
|
0%
(0/3)
|
0%
(0/12)
|
package dev.suresh.lang
import java.lang.invoke.*
import java.util.*
/**
* Run with "-XX:+UnlockDiagnosticVMOptions -XX:+ShowHiddenFrames" to see the hidden classes.
*
* --add-opens java.base/java.util=ALL-UNNAMED
*
* @since JDK15
*/
fun main() {
println("Reading Foo bytes...")
val clBytes = Foo::class.java.toBytes() ?: error("Can't load Foo!")
println(HiddenData::class.java.toBytes()?.decodeToString())
println("-------------------------")
val t = HiddenData("kotlin")
println(t.javaClass.toBytes()?.decodeToString())
val lookup = MethodHandles.lookup().defineHiddenClass(clBytes, true)
val run = lookup.findStatic(lookup.lookupClass(), "run", MethodType.methodType(Void.TYPE))
// run.invokeExact()
val mh = MethodHandles.privateLookupIn(Formatter::class.java, MethodHandles.lookup())
println(MethodHandles.lookup())
println(mh.lookupClass())
println(mh.lookupModes())
val m =
mh.findVirtual(
mh.lookupClass(),
"parse",
MethodType.methodType(java.util.List::class.java, java.lang.String::class.java))
println(m.invoke(Formatter(), "%s"))
// Concurrent
}
interface Foo {
companion object {
@JvmStatic
fun run() {
println("Inside Foo")
error("Error from $methodName")
}
}
}
data class HiddenData(val name: String)