Bridge Converter¶
As JavetProxyConverter
skips creating proxies for primitive types, List
, Set
, Map
, etc., sometimes it may be annoying that a variable is converted to a native JavaScript object by accident. So, how to fix that? JavetBridgeConverter
is the one because it creates proxies for all Java types including Integer
, Long
, String
, int[]
, long[]
, Object[]
, etc.
Usage¶
The usage is identical to the one in JavetProxyConverter
.
Preparation¶
// Step 1: Create an instance of JavetBridgeConverter.
JavetBridgeConverter javetBridgeConverter = new JavetBridgeConverter();
// Step 2: Set the V8Runtime converter to JavetBridgeConverter.
v8Runtime.setConverter(javetBridgeConverter);
Boolean¶
v8Runtime.getGlobalObject().set("bTrue", true);
v8Runtime.getGlobalObject().set("bFalse", false);
assertTrue((Boolean) v8Runtime.getExecutor("bTrue").executeObject());
assertFalse((Boolean) v8Runtime.getExecutor("bFalse").executeObject());
assertEquals(1, v8Runtime.getExecutor("bTrue.toV8Value()?1:0").executeInteger());
assertEquals(0, v8Runtime.getExecutor("bFalse.toV8Value()?1:0").executeInteger());
assertEquals(1, v8Runtime.getExecutor("bTrue[Symbol.toPrimitive]()?1:0").executeInteger());
assertEquals(0, v8Runtime.getExecutor("bFalse[Symbol.toPrimitive]()?1:0").executeInteger());
v8Runtime.getGlobalObject().delete("bTrue");
v8Runtime.getGlobalObject().delete("bFalse");
int¶
v8Runtime.getGlobalObject().set("i", 12345);
assertEquals(12345, (Integer) v8Runtime.getExecutor("i").executeObject());
assertEquals(12345, v8Runtime.getExecutor("i.toV8Value()").executeInteger());
assertEquals(12345, v8Runtime.getExecutor("i[Symbol.toPrimitive]()").executeInteger());
assertEquals(12346, v8Runtime.getExecutor("1 + i").executeInteger());
v8Runtime.getGlobalObject().delete("i");
int Array¶
int[] intArray = new int[]{1, 2};
v8Runtime.getGlobalObject().set("a", intArray);
assertEquals(2, (Integer) v8Runtime.getExecutor("a.length").executeObject());
assertEquals(1, (Integer) v8Runtime.getExecutor("a[0]").executeObject());
assertEquals(2, (Integer) v8Runtime.getExecutor("a[1]").executeObject());
assertArrayEquals(intArray, v8Runtime.getExecutor("a[Symbol.toPrimitive]()").executeObject());
assertArrayEquals(intArray, v8Runtime.getExecutor("a[Symbol.iterator]()").executeObject());
assertArrayEquals(intArray, v8Runtime.getExecutor("a.toV8Value()").executeObject());
v8Runtime.getGlobalObject().delete("a");
Integer List¶
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(2);
v8Runtime.getGlobalObject().set("a", integerList);
assertEquals(2, (Integer) v8Runtime.getExecutor("a.size()").executeObject());
assertEquals(1, (Integer) v8Runtime.getExecutor("a[0]").executeObject());
assertEquals(2, (Integer) v8Runtime.getExecutor("a[1]").executeObject());
v8Runtime.getExecutor("a.add(3);").executeVoid();
assertEquals(3, (Integer) v8Runtime.getExecutor("a.size()").executeObject());
assertEquals(3, (Integer) v8Runtime.getExecutor("a[2]").executeObject());
assertEquals(3, integerList.size());
assertEquals(3, integerList.get(2));
v8Runtime.getGlobalObject().delete("a");
Long Unmodifiable List¶
List<Long> longList = Collections.unmodifiableList(Arrays.asList(1L, 2L));
v8Runtime.getGlobalObject().set("a", longList);
assertEquals(2, (Integer) v8Runtime.getExecutor("a.size()").executeObject());
assertEquals(1L, (Long) v8Runtime.getExecutor("a[0]").executeObject());
assertEquals(2L, (Long) v8Runtime.getExecutor("a[1]").executeObject());
v8Runtime.getGlobalObject().delete("a");
String Array¶
v8Runtime.getGlobalObject().set("a", new String[]{"x", "y"});
assertEquals(2, (Integer) v8Runtime.getExecutor("a.length").executeObject());
assertEquals("x", v8Runtime.getExecutor("a[0]").executeObject());
assertEquals("y", v8Runtime.getExecutor("a[1]").executeObject());
assertEquals(
"[\"x\",\"y\"]",
v8Runtime.getExecutor("JSON.stringify(a[Symbol.toPrimitive]())").executeString());
assertEquals(
"[\"x\",\"y\"]",
v8Runtime.getExecutor("JSON.stringify(a[Symbol.iterator]())").executeString());
assertEquals(
"[\"x\",\"y\"]",
v8Runtime.getExecutor("JSON.stringify(a.toV8Value())").executeString());
v8Runtime.getGlobalObject().delete("a");
How to Cast Java Objects to JavaScript Objects?¶
There are 2 ways of casting the Java objects to the JavaScript objects.
Implicit - In JavaScript, sometimes the engine performs implicit type conversion. E.g. Given
x
is a Java stringb
,'a' + x
gives'ab'
becausex
is implicitly cast to a JavaScript string by the engine.Explicit - In JavaScript, the built-in ways of casting a variable to a primitive type or array are
[Symbol.toPrimitive]()
or[Symbol.iterator]()
. Besides, Javet providestoV8Value()
to allow the explicit type conversion.