< prev index next >
test/jdk/java/lang/invoke/MethodHandlesTest.java
Print this page
@@ -36,10 +36,11 @@
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,13 +566,36 @@
Object fL = 'L';
String fR = "R";
static Object sL = 'M';
static String sR = "S";
- static final Object[][] CASES;
+ // 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 {
- 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},
@@ -579,39 +603,65 @@
};
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 name = (isStatic ? "s" : "f") + btc;
+ String fname = (isStatic ? "s" : "f") + btc;
+ String finalFname = (isStatic ? "final_s" : "final_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);
- }
+ // 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()));
- assertTrue(isStatic == (Modifier.isStatic(field.getModifiers())));
- cases.add(new Object[]{ field, value });
+ 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);
}
- 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][]);
+ 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 >