< prev index next >
test/jdk/valhalla/valuetypes/Reflection.java
Print this page
@@ -24,47 +24,91 @@
/*
* @test
* @summary test reflection on value types
* @compile -XDenableValueTypes Point.java
- * @run main/othervm -XX:+EnableValhalla Reflection
+ * @run main/othervm -Xverify:none Reflection
*/
import java.lang.reflect.*;
public class Reflection {
public static void main(String... args) throws Exception {
Reflection test = new Reflection("Point");
test.newInstance();
+ test.constructor();
test.accessField();
+ test.setAccessible();
+ test.trySetAccessible();
+ test.staticField();
}
private final Class<?> c;
+ private final Constructor<?> ctor;
+ private final Field field;
Reflection(String cn) throws Exception {
this.c = Class.forName(cn);
if (!c.isValue()) {
throw new RuntimeException(cn + " is not a value class");
}
+
+ this.ctor = Point.class.getDeclaredConstructor();
+ this.field = c.getField("x");
}
void accessField() throws Exception {
Point o = Point.origin;
- Field x = c.getField("x");
- if (x.getInt(o) != o.x) {
- throw new RuntimeException("Unexpected Point.x value: " + x.getInt(o));
+ if (field.getInt(o) != o.x) {
+ throw new RuntimeException("Unexpected Point.x value: " + field.getInt(o));
}
try {
- x.setInt(o, 100);
+ field.setInt(o, 100);
throw new RuntimeException("IllegalAccessException not thrown");
} catch (IllegalAccessException e) {}
}
void newInstance() throws Exception {
- if (c == null) return;
-
try {
Object o = c.newInstance();
throw new RuntimeException("newInstance expected to be unsupported on value class");
- } catch (UnsupportedOperationException e) {}
+ } 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(); }
+ 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");
+ }
+ if (field.trySetAccessible()) {
+ throw new RuntimeException("trySetAccessible should not succeed");
+ }
+ }
+
+ void staticField() throws Exception {
+ Field f = Point.class.getDeclaredField("origin");
+ if (f.trySetAccessible()) {
+ throw new RuntimeException("trySetAccessible should not succeed");
+ }
+ try {
+ f.setAccessible(true);
+ throw new RuntimeException("IllegalAccessException not thrown");
+ } catch (InaccessibleObjectException e) { }
}
}
< prev index next >