Coverage Summary for Class: JPMSKt (dev.suresh.lang)
Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
JPMSKt |
0%
(0/1)
|
0%
(0/6)
|
|
0%
(0/30)
|
0%
(0/142)
|
package dev.suresh.lang
import com.javax0.sourcebuddy.Compiler
import java.io.*
import java.lang.invoke.*
import java.lang.reflect.Modifier
import java.security.*
import java.util.*
import java.util.spi.*
fun main() {
run()
}
fun run() {
val modules = ModuleLayer.boot().modules()
println("\nFound ${modules.size} jdk modules!")
val jsModule =
ModuleLayer.boot().findModule("jdk.jshell").orElseGet { error("No JShell module found!") }
// Using Tool API
jsModule.classLoader.using {
val sl = ServiceLoader.load(javax.tools.Tool::class.java)
val jShell = sl.first { it.name() == "jshell" }
println(jShell.name())
}
// Using new ToolsProvider API
val jdeps =
ToolProvider.findFirst("jdeps").orElseGet { error("jdeps tool is missing in the JDK!") }
val out = StringWriter()
val pw = PrintWriter(out)
jdeps.run(pw, pw, "--version")
val version = out.toString()
println("jdeps version: $version")
// compileJava()
// showAllSecurityProperties()
}
fun reflections() {
println("String isFinal = ${Modifier.isFinal(String::class.java.modifiers)}")
}
fun compileJava() {
Compiler.java()
.from(
"""
| package dev.suresh;
| public class TestApp implements Runnable {
| @Override
| public void run() {
| System.out.println("Hello from TestApp!");
| }
| }
"""
.trimMargin())
.compile()
.load()
.newInstance(Runnable::class.java)
.run()
}
/** @see [VarHandles](https://www.baeldung.com/java-variable-handles) */
private fun showAllSecurityProperties() {
// Should add this VM args "--add-opens=java.base/java.security=ALL-UNNAMED"
val lookup = MethodHandles.lookup()
val varHandle =
MethodHandles.privateLookupIn(Security::class.java, lookup)
.findStaticVarHandle(Security::class.java, "props", Properties::class.java)
val sec = varHandle.get() as Properties
sec.forEach { k: Any, v: Any -> println("$k --> $v") }
}