< prev index next >
test/jdk/valhalla/valuetypes/Reflection.java
Print this page
@@ -23,20 +23,24 @@
/*
* @test
* @summary test reflection on value types
- * @compile -XDallowWithFieldOperator Point.java Line.java
+ * @compile -XDallowWithFieldOperator Point.java Line.java NonFlattenValue.java
* @run main/othervm -XX:+EnableValhalla Reflection
*/
import java.lang.reflect.*;
+import java.util.Arrays;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
public class Reflection {
public static void main(String... args) throws Exception {
testPointClass();
testLineClass();
+ testNonFlattenValue();
}
static void testPointClass() throws Exception {
Point o = Point.makePoint(10, 20);
Reflection test = new Reflection("Point", o);
@@ -49,11 +53,23 @@
}
static void testLineClass() throws Exception {
Line l = Line.makeLine(10, 20, 30, 40);
Reflection test = new Reflection("Line", l);
- test.getDeclaredFields();
+ test.checkField("p1", Point.class.asValueType());
+ test.checkField("p2", Point.class.asValueType());
+ test.checkMethod("p1", Point.class.asValueType());
+ test.checkMethod("p2", Point.class.asValueType());
+ }
+
+ static void testNonFlattenValue() throws Exception {
+ NonFlattenValue nfv = NonFlattenValue.make(10, 20);
+ Reflection test = new Reflection("NonFlattenValue", nfv);
+ test.checkField("nfp", Point.class.asBoxType());
+ test.checkMethod("point", Point.class.asBoxType());
+ test.checkMethod("pointValue", Point.class.asValueType());
+ test.checkMethod("has", void.class, Point.class.asValueType(), Point.class.asBoxType());
}
private final Class<?> c;
private final Constructor<?> ctor;
private final Object o;
@@ -63,10 +79,42 @@
throw new RuntimeException(cn + " is not a value class");
}
this.ctor = c.getDeclaredConstructor();
this.o = o;
+
+ // TODO: what should Object::getClass return?
+ // assertEquals(o.getClass(), c.asValueType());
+
+ // test the box type and value type
+ testBoxAndValueType(this.c);
+ // test array of Q-type
+ // TODO: array of L-type support
+ testArrayOfQType();
+ }
+
+ private static void testBoxAndValueType(Class<?> c) {
+ Class<?> box = c.asBoxType();
+ Class<?> val = c.asValueType();
+ assertTrue(val != null);
+ assertEquals(box.getTypeName(), c.getTypeName());
+ assertEquals(val.getTypeName(), c.getTypeName() + "/val");
+ assertEquals(box, c);
+ assertEquals(val.asBoxType(), box);
+ assertEquals(box.asValueType(), val);
+ }
+
+ void testArrayOfQType() {
+ Class<?> elementType = c.asValueType();
+ Object array = Array.newInstance(elementType, 1);
+ Class<?> arrayType = array.getClass();
+ assertTrue(arrayType.isArray());
+ Class<?> componentType = arrayType.getComponentType();
+ assertTrue(componentType.isValue());
+ assertEquals(componentType, elementType);
+ // Array is a reference type
+ assertEquals(arrayType.asBoxType(), arrayType);
}
void accessFieldX(int x) throws Exception {
Field field = c.getField("x");
if (field.getInt(o) != x) {
@@ -124,11 +172,36 @@
f.setAccessible(true);
throw new RuntimeException("IllegalAccessException not thrown");
} catch (InaccessibleObjectException e) { }
}
- void getDeclaredFields() throws Exception {
- for (Field f : c.getDeclaredFields()) {
- System.out.println(f.getName() + " = " + f.get(o));
+ void checkField(String name, Class<?> type) throws Exception {
+ Field f = c.getDeclaredField(name);
+ System.out.format("Field %s::%s of type %s = %s%n",
+ f.getDeclaringClass().getTypeName(), f.getName(),
+ f.getType().getTypeName(), f.get(o));
+ assertEquals(f.getType(), type);
+ }
+
+ void checkMethod(String name, Class<?> returnType, Class<?>... params) throws Exception {
+ Method m = c.getDeclaredMethod(name, params);
+
+ String paramDesc = (params == null || params.length == 0) ? "" :
+ Arrays.stream(params).map(Class::getTypeName).collect(Collectors.joining(", "));
+ System.out.format("Method %s::%s(%s)%s%n",
+ m.getDeclaringClass().getTypeName(), m.getName(),
+ paramDesc, returnType.getTypeName());
+ }
+
+ static void assertEquals(Object o1, Object o2) {
+ if (o1 == o2 || o1.equals(o2))
+ return;
+
+ throw new AssertionError(o1 + " != " + o2);
}
+
+ static void assertTrue(boolean value) {
+ if (!value)
+ throw new AssertionError("expected true");
+
}
}
< prev index next >