< prev index next >
test/jdk/java/lang/invoke/MethodHandlesTest.java
Print this page
*** 36,45 ****
--- 36,46 ----
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+ import java.util.stream.Stream;
import static org.junit.Assert.*;
/**
*
*** 565,577 ****
Object fL = 'L';
String fR = "R";
static Object sL = 'M';
static String sR = "S";
! static final Object[][] CASES;
static {
- ArrayList<Object[]> cases = new ArrayList<>();
Object types[][] = {
{'L',Object.class}, {'R',String.class},
{'I',int.class}, {'J',long.class},
{'F',float.class}, {'D',double.class},
{'Z',boolean.class}, {'B',byte.class},
--- 566,601 ----
Object fL = 'L';
String fR = "R";
static Object sL = 'M';
static String sR = "S";
! // final fields
! final boolean final_fZ = false;
! final byte final_fB = (byte)'B';
! final short final_fS = (short)'S';
! final char final_fC = 'C';
! final int final_fI = 'I';
! final long final_fJ = 'J';
! final float final_fF = 'F';
! final double final_fD = 'D';
! final static boolean final_sZ = true;
! final static byte final_sB = 1+(byte)'B';
! final static short final_sS = 1+(short)'S';
! final static char final_sC = 1+'C';
! final static int final_sI = 1+'I';
! final static long final_sJ = 1+'J';
! final static float final_sF = 1+'F';
! final static double final_sD = 1+'D';
!
! final Object final_fL = 'L';
! final String final_fR = "R";
! final static Object final_sL = 'M';
! final static String final_sR = "S";
!
! static final ArrayList<Object[]> STATIC_FIELD_CASES = new ArrayList<>();
! static final ArrayList<Object[]> INSTANCE_FIELD_CASES = new ArrayList<>();
static {
Object types[][] = {
{'L',Object.class}, {'R',String.class},
{'I',int.class}, {'J',long.class},
{'F',float.class}, {'D',double.class},
{'Z',boolean.class}, {'B',byte.class},
*** 579,617 ****
};
HasFields fields = new HasFields();
for (Object[] t : types) {
for (int kind = 0; kind <= 1; kind++) {
boolean isStatic = (kind != 0);
char btc = (Character)t[0];
! String name = (isStatic ? "s" : "f") + btc;
Class<?> type = (Class<?>) t[1];
! Object value;
! Field field;
! try {
! field = HasFields.class.getDeclaredField(name);
! } catch (NoSuchFieldException | SecurityException ex) {
! throw new InternalError("no field HasFields."+name);
! }
! try {
! value = field.get(fields);
! } catch (IllegalArgumentException | IllegalAccessException ex) {
! throw new InternalError("cannot fetch field HasFields."+name);
! }
if (type == float.class) {
float v = 'F';
if (isStatic) v++;
assertTrue(value.equals(v));
}
assertTrue(name.equals(field.getName()));
assertTrue(type.equals(field.getType()));
! assertTrue(isStatic == (Modifier.isStatic(field.getModifiers())));
! cases.add(new Object[]{ field, value });
}
}
! cases.add(new Object[]{ new Object[]{ false, HasFields.class, "bogus_fD", double.class }, Error.class });
! cases.add(new Object[]{ new Object[]{ true, HasFields.class, "bogus_sL", Object.class }, Error.class });
! CASES = cases.toArray(new Object[0][]);
}
}
static final int TEST_UNREFLECT = 1, TEST_FIND_FIELD = 2, TEST_FIND_STATIC = 3, TEST_SETTER = 0x10, TEST_BOUND = 0x20, TEST_NPE = 0x40;
--- 603,667 ----
};
HasFields fields = new HasFields();
for (Object[] t : types) {
for (int kind = 0; kind <= 1; kind++) {
boolean isStatic = (kind != 0);
+ ArrayList<Object[]> cases = isStatic ? STATIC_FIELD_CASES : INSTANCE_FIELD_CASES;
char btc = (Character)t[0];
! String fname = (isStatic ? "s" : "f") + btc;
! String finalFname = (isStatic ? "final_s" : "final_f") + btc;
Class<?> type = (Class<?>) t[1];
! // non-final field
! Field nonFinalField = getField(fname, type);
! Object value = getValue(fields, nonFinalField);
if (type == float.class) {
float v = 'F';
if (isStatic) v++;
assertTrue(value.equals(v));
}
+ assertTrue(isStatic == (Modifier.isStatic(nonFinalField.getModifiers())));
+ cases.add(new Object[]{ nonFinalField, value });
+
+ // setAccessible(true) on final field but static final field only has read access
+ Field finalField = getField(finalFname, type);
+ finalField.setAccessible(true);
+ assertTrue(isStatic == (Modifier.isStatic(finalField.getModifiers())));
+ cases.add(new Object[]{ finalField, value, Error.class});
+ }
+ }
+ INSTANCE_FIELD_CASES.add(new Object[]{ new Object[]{ false, HasFields.class, "bogus_fD", double.class }, Error.class });
+ STATIC_FIELD_CASES.add(new Object[]{ new Object[]{ true, HasFields.class, "bogus_sL", Object.class }, Error.class });
+ }
+
+ static Field getField(String name, Class<?> type) {
+ try {
+ Field field = HasFields.class.getDeclaredField(name);
assertTrue(name.equals(field.getName()));
assertTrue(type.equals(field.getType()));
! return field;
! } catch (NoSuchFieldException | SecurityException ex) {
! throw new InternalError("no field HasFields."+name);
! }
! }
!
! static Object getValue(Object o, Field field) {
! try {
! return field.get(o);
! } catch (IllegalArgumentException | IllegalAccessException ex) {
! throw new InternalError("cannot fetch field HasFields."+field.getName());
! }
}
+ static Object[][] cases(int testMode) {
+ if ((testMode & TEST_UNREFLECT) != 0) {
+ return Stream.concat(STATIC_FIELD_CASES.stream(), INSTANCE_FIELD_CASES.stream())
+ .toArray(Object[][]::new);
+ } else if ((testMode & TEST_FIND_STATIC) != 0) {
+ return STATIC_FIELD_CASES.stream().toArray(Object[][]::new);
+ } else if ((testMode & TEST_FIND_FIELD) != 0) {
+ return INSTANCE_FIELD_CASES.stream().toArray(Object[][]::new);
}
! throw new InternalError("unexpected test mode: " + testMode);
}
}
static final int TEST_UNREFLECT = 1, TEST_FIND_FIELD = 2, TEST_FIND_STATIC = 3, TEST_SETTER = 0x10, TEST_BOUND = 0x20, TEST_NPE = 0x40;
< prev index next >