< prev index next >

test/jdk/valhalla/valuetypes/Reflection.java

Print this page

        

*** 23,42 **** /* * @test * @summary test reflection on value types ! * @compile -XDallowWithFieldOperator Point.java Line.java * @run main/othervm -XX:+EnableValhalla Reflection */ import java.lang.reflect.*; public class Reflection { public static void main(String... args) throws Exception { testPointClass(); testLineClass(); } static void testPointClass() throws Exception { Point o = Point.makePoint(10, 20); Reflection test = new Reflection("Point", o); --- 23,46 ---- /* * @test * @summary test reflection on value types ! * @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,59 **** } static void testLineClass() throws Exception { Line l = Line.makeLine(10, 20, 30, 40); Reflection test = new Reflection("Line", l); ! test.getDeclaredFields(); } private final Class<?> c; private final Constructor<?> ctor; private final Object o; --- 53,75 ---- } static void testLineClass() throws Exception { Line l = Line.makeLine(10, 20, 30, 40); Reflection test = new Reflection("Line", l); ! 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,72 **** --- 79,120 ---- 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,134 **** 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)); } } } --- 172,207 ---- f.setAccessible(true); throw new RuntimeException("IllegalAccessException not thrown"); } catch (InaccessibleObjectException e) { } } ! 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 >