< 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 >