Para imitar en GraalVM JavaScript algunas de las funciones de Node en util.types , recurrí a las funciones de Java a las que puedo acceder a través Java.type o las variables globales del paquete Java. GraalVM tiene funciones internas como JSProxy.isJSProxy y JSSet.isJSSet que hacen esto. Los hice accesibles marcándolos como exportados, recompilados y probados (accedí a ellos con, por ejemplo, Java.type("com.oracle.truffle.js.builtins.runtime.JSProxy").isJSProxy ).
Como descubrí, las funciones internas de JavaScript de GraalVM son inútiles para mí. Por ejemplo, JSProxy.isJSProxy solo devuelve true si se le pasa una instancia de JSProxyObject . La documentación de Oracle dice que
Los objetos JavaScript se exponen al código Java como instancias de
com.oracle.truffle.api.interop.java.TruffleMap. Esta clase implementa la interfaz Map de Java.
TruffleMap no aparece en el código fuente de GraalVM JavaScript y solo aparece una vez en el código fuente de GraalVM , por lo que probablemente esté en desuso, pero eso no viene al caso porque el método de representación probablemente sea el mismo.
Cualquiera que sea la representación externa del lado de Java de los objetos JS en este momento, ¿contiene información sobre cuál es el tipo de objeto en el lado de JavaScript? ¿Puedo determinar si es un proxy JS? ¿Puedo determinar si es un objeto Set ? (Y así sucesivamente para los tipos de objetos nativos de JavaScript).
Para ser honesto, su pregunta es bastante confusa para mí, pero ¿solo está buscando el operador instanceof ?
import org.graalvm.polyglot.*; import org.graalvm.polyglot.proxy.*; public class Test { public static class MyClass { public int id = 42; } public static void main(String[] args) { try (Context context = Context.newBuilder().allowAllAccess(true).build()) { context.getBindings("js").putMember("javaObj", new MyClass()); boolean valid = context .eval("js", "javaObj instanceof Java.type('Test$MyClass')") .asBoolean(); assert valid; } } }