< prev index next >

test/jdk/valhalla/valuetypes/Reflection.java

Print this page
rev 55688 : 8223349: [lworld] Reflection support on static <init> factory methods for inline types
Reviewed-by: jrose

*** 27,39 **** * @summary test reflection on inline 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.Collectors; public class Reflection { public static void main(String... args) throws Exception { testPointClass(); testLineClass(); --- 27,43 ---- * @summary test reflection on inline types * @compile -XDallowWithFieldOperator Point.java Line.java NonFlattenValue.java * @run main/othervm -XX:+EnableValhalla Reflection */ ! import java.lang.reflect.Array; ! import java.lang.reflect.Constructor; ! import java.lang.reflect.Field; ! import java.lang.reflect.InaccessibleObjectException; ! import java.lang.reflect.Method; ! import java.lang.reflect.Modifier; import java.util.Arrays; public class Reflection { public static void main(String... args) throws Exception { testPointClass(); testLineClass();
*** 45,76 **** --- 49,84 ---- static void testPointClass() throws Exception { Point o = Point.makePoint(10, 20); Reflection test = new Reflection(Point.class, "Point", o); test.newInstance(); test.constructor(); + test.pointConstructors(); test.accessFieldX(o.x); test.setAccessible(); test.trySetAccessible(); test.staticField(); + test.requireNoStaticInit(); } static void testLineClass() throws Exception { Line l = Line.makeLine(10, 20, 30, 40); Reflection test = new Reflection(Line.class, "Line", l); test.checkField("public final Point Line.p1", "p1", Point.class); test.checkField("public final Point Line.p2", "p2", Point.class); test.checkMethod("public Point Line.p1()", "p1", Point.class); test.checkMethod("public Point Line.p2()", "p2", Point.class); + test.requireNoStaticInit(); } static void testNonFlattenValue() throws Exception { NonFlattenValue nfv = NonFlattenValue.make(10, 20); Reflection test = new Reflection(NonFlattenValue.class, "NonFlattenValue", nfv); test.checkField("final Point? NonFlattenValue.nfp", "nfp", Point.class.asNullableType()); test.checkMethod("public Point NonFlattenValue.pointValue()", "pointValue", Point.class); test.checkMethod("public Point? NonFlattenValue.point()", "point", Point.class.asNullableType()); test.checkMethod("public boolean NonFlattenValue.has(Point,Point?)", "has", boolean.class, Point.class, Point.class.asNullableType()); + test.requireNoStaticInit(); } /* * Tests reflection APIs with the primary and nullable mirror */
*** 171,210 **** field.setInt(o, 100); throw new RuntimeException("IllegalAccessException not thrown"); } catch (IllegalAccessException e) {} } void newInstance() throws Exception { - try { Object o = c.newInstance(); ! throw new RuntimeException("newInstance expected to be unsupported on inline class"); ! } catch (IllegalAccessException e) {} } void constructor() throws Exception { ! try { ! ctor.newInstance(); ! throw new RuntimeException("IllegalAccessException not thrown"); ! } catch (IllegalAccessException e) { } } void setAccessible() throws Exception { - try { ctor.setAccessible(true); - throw new RuntimeException("InaccessibleObjectException not thrown"); - } catch (InaccessibleObjectException e) { e.printStackTrace(); } Field field = c.getField("x"); try { field.setAccessible(true); throw new RuntimeException("InaccessibleObjectException not thrown"); ! } catch (InaccessibleObjectException e) { e.printStackTrace(); } } void trySetAccessible() throws Exception { ! if (ctor.trySetAccessible()) { ! throw new RuntimeException("trySetAccessible should not succeed"); ! } Field field = c.getField("x"); if (field.trySetAccessible()) { throw new RuntimeException("trySetAccessible should not succeed"); } } --- 179,233 ---- field.setInt(o, 100); throw new RuntimeException("IllegalAccessException not thrown"); } catch (IllegalAccessException e) {} } + @SuppressWarnings("deprecation") void newInstance() throws Exception { Object o = c.newInstance(); ! assertEquals(o.getClass(), c); } void constructor() throws Exception { ! Object o = ctor.newInstance(); ! assertEquals(o.getClass(), c); ! } ! ! void pointConstructors() throws Exception { ! Constructor<?>[] cons = c.getDeclaredConstructors(); ! for (int i = 0; i < cons.length; i++) { ! Class<?>[] params = cons[i].getParameterTypes(); ! Object o = null; ! switch (params.length) { ! case 0: ! o = cons[i].newInstance(); ! break; ! case 2: ! o = cons[i].newInstance(1, 2); ! break; ! default: ! throw new RuntimeException(String.format("NYI: arguments: %s%n", ! Arrays.toString(params))); ! } ! System.out.printf("%s.getDeclaredConstructors()[%d].newInstance(): %s%n", ! c.getName(), i, o); ! } } void setAccessible() throws Exception { ctor.setAccessible(true); Field field = c.getField("x"); try { field.setAccessible(true); throw new RuntimeException("InaccessibleObjectException not thrown"); ! } catch (InaccessibleObjectException e) { ! System.out.println("as expected: " + e.toString()); ! } } void trySetAccessible() throws Exception { ! ctor.trySetAccessible(); Field field = c.getField("x"); if (field.trySetAccessible()) { throw new RuntimeException("trySetAccessible should not succeed"); } }
*** 229,238 **** --- 252,271 ---- void checkMethod(String source, String name, Class<?> returnType, Class<?>... params) throws Exception { Method m = c.getDeclaredMethod(name, params); assertEquals(m.toString(), source); } + // Check that the class does not have a static method with the name <init> + void requireNoStaticInit() throws Exception { + Method[] methods = c.getDeclaredMethods(); + for (Method m : methods) { + if (Modifier.isStatic(m.getModifiers())) { + assertFalse(m.getName().equals("<init>")); + } + } + } + static void assertEquals(Object o1, Object o2) { if (o1 == o2 || o1.equals(o2)) return; throw new AssertionError(o1 + " != " + o2);
< prev index next >