From 07efbf9c01baf275cc34a595af9ac9c9357c1757 Mon Sep 17 00:00:00 2001 From: Dominik Date: Wed, 13 Dec 2017 23:53:42 +0100 Subject: [PATCH] VarHandles --- .../java9/varhandles/VariableHandlesTest.java | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java diff --git a/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java b/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java new file mode 100644 index 0000000000..210c4f0654 --- /dev/null +++ b/core-java-9/src/test/java/com/baeldung/java9/varhandles/VariableHandlesTest.java @@ -0,0 +1,91 @@ +package com.baeldung.java9.varhandles; + +import org.junit.Assert; +import org.junit.Test; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; + +public class VariableHandlesTest { + public int publicTestVariable = 1; + private int privateTestVariable = 1; + public int variableToSet = 1; + public int variableToCompareAndSet = 1; + public int variableToGetAndAdd = 0; + public byte variableToBitwiseOr = 0; + @Test + public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() + throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"publicTestVariable", int.class); + Assert.assertEquals(1, publicIntHandle.coordinateTypes().size()); + Assert.assertEquals(VariableHandlesTest.class, publicIntHandle.coordinateTypes().get(0)); + + } + + @Test + public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() + throws NoSuchFieldException, IllegalAccessException { + VarHandle privateIntHandle = MethodHandles.privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup()) + .findVarHandle(VariableHandlesTest.class,"privateTestVariable", int.class); + Assert.assertNotNull(privateIntHandle); + Assert.assertEquals(1, privateIntHandle.coordinateTypes().size()); + Assert.assertEquals(VariableHandlesTest.class, privateIntHandle.coordinateTypes().get(0)); + + } + + @Test + public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() + throws NoSuchFieldException, IllegalAccessException { + VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); + Assert.assertEquals(2, arrayVarHandle.coordinateTypes().size()); + Assert.assertEquals(int[].class, arrayVarHandle.coordinateTypes().get(0)); + } + + @Test + public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"publicTestVariable", int.class); + Assert.assertEquals(1, publicIntHandle.get(this)); + } + + @Test + public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"variableToSet", int.class); + publicIntHandle.set(this, 15); + Assert.assertEquals(15, publicIntHandle.get(this)); + } + + @Test + public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"variableToCompareAndSet", int.class); + publicIntHandle.compareAndSet(this, 1,100); + Assert.assertEquals(100, publicIntHandle.get(this)); + } + + @Test + public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"variableToGetAndAdd", int.class); + int before = (int) publicIntHandle.getAndAdd(this, 200); + Assert.assertEquals(0, before); + Assert.assertEquals(200, publicIntHandle.get(this)); + } + + @Test + public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { + VarHandle publicIntHandle = MethodHandles.lookup() + .in(VariableHandlesTest.class) + .findVarHandle(VariableHandlesTest.class,"variableToBitwiseOr", byte.class); + byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127); + Assert.assertEquals(0, before); + Assert.assertEquals(127, variableToBitwiseOr); + } +}