BAEL1367: VarHandles Article

This commit is contained in:
Dominik 2017-12-16 19:37:43 +01:00
parent 07efbf9c01
commit ec95d9b208

View File

@ -1,91 +1,106 @@
package com.baeldung.java9.varhandles; package com.baeldung.java9.varhandles;
import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle; import java.lang.invoke.VarHandle;
import static org.assertj.core.api.Assertions.assertThat;
public class VariableHandlesTest { public class VariableHandlesTest {
public int publicTestVariable = 1; public int publicTestVariable = 1;
private int privateTestVariable = 1; private int privateTestVariable = 1;
public int variableToSet = 1; public int variableToSet = 1;
public int variableToCompareAndSet = 1; public int variableToCompareAndSet = 1;
public int variableToGetAndAdd = 0; public int variableToGetAndAdd = 0;
public byte variableToBitwiseOr = 0; public byte variableToBitwiseOr = 0;
@Test @Test
public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() public void whenVariableHandleForPublicVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
throws NoSuchFieldException, IllegalAccessException { VarHandle publicIntHandle = MethodHandles
VarHandle publicIntHandle = MethodHandles.lookup() .lookup()
.in(VariableHandlesTest.class) .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesTest.class,"publicTestVariable", int.class); .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class);
Assert.assertEquals(1, publicIntHandle.coordinateTypes().size());
Assert.assertEquals(VariableHandlesTest.class, publicIntHandle.coordinateTypes().get(0)); assertThat(publicIntHandle.coordinateTypes().size() == 1);
assertThat(publicIntHandle.coordinateTypes().get(0) == VariableHandles.class);
} }
@Test @Test
public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() public void whenVariableHandleForPrivateVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
throws NoSuchFieldException, IllegalAccessException { VarHandle privateIntHandle = MethodHandles
VarHandle privateIntHandle = MethodHandles.privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup()) .privateLookupIn(VariableHandlesTest.class, MethodHandles.lookup())
.findVarHandle(VariableHandlesTest.class,"privateTestVariable", int.class); .findVarHandle(VariableHandlesTest.class, "privateTestVariable", int.class);
Assert.assertNotNull(privateIntHandle);
Assert.assertEquals(1, privateIntHandle.coordinateTypes().size()); assertThat(privateIntHandle.coordinateTypes().size() == 1);
Assert.assertEquals(VariableHandlesTest.class, privateIntHandle.coordinateTypes().get(0)); assertThat(privateIntHandle.coordinateTypes().get(0) == VariableHandlesTest.class);
} }
@Test @Test
public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() public void whenVariableHandleForArrayVariableIsCreated_ThenItIsInitializedProperly() throws NoSuchFieldException, IllegalAccessException {
throws NoSuchFieldException, IllegalAccessException { VarHandle arrayVarHandle = MethodHandles
VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); .arrayElementVarHandle(int[].class);
Assert.assertEquals(2, arrayVarHandle.coordinateTypes().size());
Assert.assertEquals(int[].class, arrayVarHandle.coordinateTypes().get(0)); assertThat(arrayVarHandle.coordinateTypes().size() == 2);
assertThat(arrayVarHandle.coordinateTypes().get(0) == int[].class);
} }
@Test @Test
public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenGetIsInvoked_ThenValueOfVariableIsReturned() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles.lookup() VarHandle publicIntHandle = MethodHandles
.in(VariableHandlesTest.class) .lookup()
.findVarHandle(VariableHandlesTest.class,"publicTestVariable", int.class); .in(VariableHandlesTest.class)
Assert.assertEquals(1, publicIntHandle.get(this)); .findVarHandle(VariableHandlesTest.class, "publicTestVariable", int.class);
assertThat((int) publicIntHandle.get(this) == 1);
} }
@Test @Test
public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles.lookup() VarHandle publicIntHandle = MethodHandles
.in(VariableHandlesTest.class) .lookup()
.findVarHandle(VariableHandlesTest.class,"variableToSet", int.class); .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesTest.class, "variableToSet", int.class);
publicIntHandle.set(this, 15); publicIntHandle.set(this, 15);
Assert.assertEquals(15, publicIntHandle.get(this));
assertThat((int) publicIntHandle.get(this) == 15);
} }
@Test @Test
public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenCompareAndSetIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles.lookup() VarHandle publicIntHandle = MethodHandles
.in(VariableHandlesTest.class) .lookup()
.findVarHandle(VariableHandlesTest.class,"variableToCompareAndSet", int.class); .in(VariableHandlesTest.class)
publicIntHandle.compareAndSet(this, 1,100); .findVarHandle(VariableHandlesTest.class, "variableToCompareAndSet", int.class);
Assert.assertEquals(100, publicIntHandle.get(this)); publicIntHandle.compareAndSet(this, 1, 100);
assertThat((int) publicIntHandle.get(this) == 100);
} }
@Test @Test
public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenGetAndAddIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles.lookup() VarHandle publicIntHandle = MethodHandles
.in(VariableHandlesTest.class) .lookup()
.findVarHandle(VariableHandlesTest.class,"variableToGetAndAdd", int.class); .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesTest.class, "variableToGetAndAdd", int.class);
int before = (int) publicIntHandle.getAndAdd(this, 200); int before = (int) publicIntHandle.getAndAdd(this, 200);
Assert.assertEquals(0, before);
Assert.assertEquals(200, publicIntHandle.get(this)); assertThat(before == 0);
assertThat((int) publicIntHandle.get(this) == 200);
} }
@Test @Test
public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException { public void givenVarHandle_whenGetAndBitwiseOrIsInvoked_ThenValueOfVariableIsChanged() throws NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles.lookup() VarHandle publicIntHandle = MethodHandles
.in(VariableHandlesTest.class) .lookup()
.findVarHandle(VariableHandlesTest.class,"variableToBitwiseOr", byte.class); .in(VariableHandlesTest.class)
.findVarHandle(VariableHandlesTest.class, "variableToBitwiseOr", byte.class);
byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127); byte before = (byte) publicIntHandle.getAndBitwiseOr(this, (byte) 127);
Assert.assertEquals(0, before);
Assert.assertEquals(127, variableToBitwiseOr); assertThat(before == 0);
assertThat(variableToBitwiseOr == 127);
} }
} }