/* * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/** * @test * @bug 8277451 * @run testng/othervm -Djdk.reflect.useDirectMethodHandle=true NegativeTest * @run testng/othervm -Djdk.reflect.useDirectMethodHandle=false NegativeTest * @summary Test exception thrown due to bad receiver and bad value on * Field with and without setAccessible(true)
*/
staticfinal Field i_field = field("i", false); staticfinal Field c_field = field("c", false); staticfinal Field b_field = field("b", false); staticfinal Field s_field = field("s", false); staticfinal Field l_field = field("l", false); staticfinal Field d_field = field("d", false); staticfinal Field f_field = field("f", false); staticfinal Field z_field = field("z", false); staticfinal Field o_field = field("o", false); staticfinal Field fi_field = field("fi", false); staticfinal Field fc_field = field("fc", false); staticfinal Field fb_field = field("fb", false); staticfinal Field fs_field = field("fs", false); staticfinal Field fl_field = field("fl", false); staticfinal Field fd_field = field("fd", false); staticfinal Field ff_field = field("ff", false); staticfinal Field fz_field = field("fz", false); staticfinal Field fo_field = field("fo", false);
staticfinal Field override_i_field = field("i", true); staticfinal Field override_c_field = field("c", true); staticfinal Field override_b_field = field("b", true); staticfinal Field override_s_field = field("s", true); staticfinal Field override_l_field = field("l", true); staticfinal Field override_d_field = field("d", true); staticfinal Field override_f_field = field("f", true); staticfinal Field override_z_field = field("z", true); staticfinal Field override_o_field = field("o", true); staticfinal Field override_fi_field = field("fi", true); staticfinal Field override_fc_field = field("fc", true); staticfinal Field override_fb_field = field("fb", true); staticfinal Field override_fs_field = field("fs", true); staticfinal Field override_fl_field = field("fl", true); staticfinal Field override_fd_field = field("fd", true); staticfinal Field override_ff_field = field("ff", true); staticfinal Field override_fz_field = field("fz", true); staticfinal Field override_fo_field = field("fo", true);
staticfinal Field si_field = field("si", false); staticfinal Field sc_field = field("sc", false); staticfinal Field sb_field = field("sb", false); staticfinal Field ss_field = field("ss", false); staticfinal Field sl_field = field("sl", false); staticfinal Field sd_field = field("sd", false); staticfinal Field sf_field = field("sf", false); staticfinal Field sz_field = field("sz", false); staticfinal Field so_field = field("so", false); staticfinal Field sfi_field = field("sfi", false); staticfinal Field sfc_field = field("sfc", false); staticfinal Field sfb_field = field("sfb", false); staticfinal Field sfs_field = field("sfs", false); staticfinal Field sfl_field = field("sfl", false); staticfinal Field sfd_field = field("sfd", false); staticfinal Field sff_field = field("sff", false); staticfinal Field sfz_field = field("sfz", false); staticfinal Field sfo_field = field("sfo", false);
staticfinal Field override_si_field = field("si", true); staticfinal Field override_sc_field = field("sc", true); staticfinal Field override_sb_field = field("sb", true); staticfinal Field override_ss_field = field("ss", true); staticfinal Field override_sl_field = field("sl", true); staticfinal Field override_sd_field = field("sd", true); staticfinal Field override_sf_field = field("sf", true); staticfinal Field override_sz_field = field("sz", true); staticfinal Field override_so_field = field("so", true); staticfinal Field override_sfi_field = field("sfi", true); staticfinal Field override_sfc_field = field("sfc", true); staticfinal Field override_sfb_field = field("sfb", true); staticfinal Field override_sfs_field = field("sfs", true); staticfinal Field override_sfl_field = field("sfl", true); staticfinal Field override_sfd_field = field("sfd", true); staticfinal Field override_sff_field = field("sff", true); staticfinal Field override_sfz_field = field("sfz", true); staticfinal Field override_sfo_field = field("sfo", true);
privatestatic Field field(String name, boolean suppressAccessCheck) { try {
Field f = Fields.class.getDeclaredField(name); if (suppressAccessCheck) {
f.setAccessible(true);
} return f;
} catch (ReflectiveOperationException e) { thrownew RuntimeException(e);
}
}
@DataProvider(name = "instanceFields") private Object[][] instanceFields() { returnnew Object[][]{ new Object[]{i_field}, new Object[]{c_field}, new Object[]{b_field}, new Object[]{s_field}, new Object[]{l_field}, new Object[]{d_field}, new Object[]{f_field}, new Object[]{z_field}, new Object[]{o_field}, new Object[]{override_i_field}, new Object[]{override_c_field}, new Object[]{override_b_field}, new Object[]{override_s_field}, new Object[]{override_l_field}, new Object[]{override_d_field}, new Object[]{override_f_field}, new Object[]{override_z_field}, new Object[]{override_o_field}, // final instance fields new Object[]{fi_field}, new Object[]{fc_field}, new Object[]{fb_field}, new Object[]{fs_field}, new Object[]{fl_field}, new Object[]{fd_field}, new Object[]{ff_field}, new Object[]{fz_field}, new Object[]{fo_field}, new Object[]{override_fi_field}, new Object[]{override_fc_field}, new Object[]{override_fb_field}, new Object[]{override_fs_field}, new Object[]{override_fl_field}, new Object[]{override_fd_field}, new Object[]{override_ff_field}, new Object[]{override_fz_field}, new Object[]{override_fo_field},
};
} privatestatic Fields INSTANCE = new Fields();
/* * Test Field::get on a good receiver, a bad receiver and null. * * IllegalArgumentException is thrown if the receiver is of * a bad type. NullPointerException is thrown if the receiver is null.
*/
@Test(dataProvider = "instanceFields") publicvoid testReceiver(Field f) throws ReflectiveOperationException {
f.get(INSTANCE); // good receiver
@DataProvider(name = "writeableFields") private Object[][] writeableFields() {
Fields obj = new Fields(); returnnew Object[][]{ // instance fields with and without setAccessible(true) new Object[]{i_field, obj, Integer.valueOf(10)}, new Object[]{c_field, obj, Character.valueOf('c')}, new Object[]{b_field, obj, Byte.valueOf((byte)1)}, new Object[]{s_field, obj, Short.valueOf((short)2)}, new Object[]{l_field, obj, Long.valueOf(1000)}, new Object[]{d_field, obj, Double.valueOf(1.2)}, new Object[]{f_field, obj, Float.valueOf(2.5f)}, new Object[]{z_field, obj, Boolean.valueOf(true)}, new Object[]{o_field, obj, "good-value"}, new Object[]{override_i_field, obj, Integer.valueOf(10)}, new Object[]{override_c_field, obj, Character.valueOf('c')}, new Object[]{override_b_field, obj, Byte.valueOf((byte)1)}, new Object[]{override_s_field, obj, Short.valueOf((short)2)}, new Object[]{override_l_field, obj, Long.valueOf(1000)}, new Object[]{override_d_field, obj, Double.valueOf(1.2)}, new Object[]{override_f_field, obj, Float.valueOf(2.5f)}, new Object[]{override_z_field, obj, Boolean.valueOf(true)}, new Object[]{override_o_field, obj, "good-value"}, // instance final fields with setAccessible(true) new Object[]{override_fi_field, obj, Integer.valueOf(10)}, new Object[]{override_fc_field, obj, Character.valueOf('c')}, new Object[]{override_fb_field, obj, Byte.valueOf((byte)1)}, new Object[]{override_fs_field, obj, Short.valueOf((short)2)}, new Object[]{override_fl_field, obj, Long.valueOf(1000)}, new Object[]{override_fd_field, obj, Double.valueOf(1.2)}, new Object[]{override_ff_field, obj, Float.valueOf(2.5f)}, new Object[]{override_fz_field, obj, Boolean.valueOf(true)}, new Object[]{override_fo_field, obj, "good-value"}, // static fields with and without setAccessible(true) new Object[]{si_field, null, Integer.valueOf(10)}, new Object[]{sc_field, null, Character.valueOf('c')}, new Object[]{sb_field, null, Byte.valueOf((byte)1)}, new Object[]{ss_field, null, Short.valueOf((short)2)}, new Object[]{sl_field, null, Long.valueOf(1000)}, new Object[]{sd_field, null, Double.valueOf(1.2)}, new Object[]{sf_field, null, Float.valueOf(2.5f)}, new Object[]{sz_field, null, Boolean.valueOf(true)}, new Object[]{so_field, null, "good-value"}, new Object[]{override_si_field, null, Integer.valueOf(10)}, new Object[]{override_sc_field, null, Character.valueOf('c')}, new Object[]{override_sb_field, null, Byte.valueOf((byte)1)}, new Object[]{override_ss_field, null, Short.valueOf((short)2)}, new Object[]{override_sl_field, null, Long.valueOf(1000)}, new Object[]{override_sd_field, null, Double.valueOf(1.2)}, new Object[]{override_sf_field, null, Float.valueOf(2.5f)}, new Object[]{override_sz_field, null, Boolean.valueOf(true)}, new Object[]{override_so_field, null, "good-value"},
};
}
/* * Test Field::set with a good and bad value. * Test setting to null if the field type is primitive. * * IllegalArgumentException is thrown if the value is of a bad type or null. * NullPointerException is thrown if the receiver of an instance field is null. * The receiver is checked
*/
@Test(dataProvider = "writeableFields") publicvoid testSetValue(Field f, Object obj, Object value) throws IllegalAccessException {
f.set(obj, value); Class<?> fType = f.getType(); if (fType.isPrimitive()) { switch (fType.descriptorString()) { case"B" -> f.setByte(obj, ((Byte) value).byteValue()); case"C" -> f.setChar(obj, ((Character) value).charValue()); case"D" -> f.setDouble(obj, ((Double) value).doubleValue()); case"F" -> f.setFloat(obj, ((Float) value).floatValue()); case"I" -> f.setInt(obj, ((Integer) value).intValue()); case"J" -> f.setLong(obj, ((Long) value).longValue()); case"S" -> f.setShort(obj, ((Short) value).shortValue()); case"Z" -> f.setBoolean(obj, ((Boolean) value).booleanValue());
}
// test null value only if it's primitive type try {
f.set(obj, null);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) { // expected
}
}
@DataProvider(name = "readOnlyFinalFields") private Object[][] readOnlyFinalFields() {
Object obj = INSTANCE; returnnew Object[][]{ // instance final fields new Object[]{fi_field, obj, Integer.valueOf(10)}, new Object[]{fc_field, obj, Character.valueOf('c')}, new Object[]{fb_field, obj, Byte.valueOf((byte)1)}, new Object[]{fs_field, obj, Short.valueOf((short)2)}, new Object[]{fl_field, obj, Long.valueOf(1000)}, new Object[]{fd_field, obj, Double.valueOf(1.2)}, new Object[]{ff_field, obj, Float.valueOf(2.5f)}, new Object[]{fz_field, obj, Boolean.valueOf(true)}, new Object[]{fo_field, obj, "good-value"}, // static final fields new Object[]{sfi_field, null, Integer.valueOf(10)}, new Object[]{sfc_field, null, Character.valueOf('c')}, new Object[]{sfb_field, null, Byte.valueOf((byte)1)}, new Object[]{sfs_field, null, Short.valueOf((short)2)}, new Object[]{sfl_field, null, Long.valueOf(1000)}, new Object[]{sfd_field, null, Double.valueOf(1.2)}, new Object[]{sff_field, null, Float.valueOf(2.5f)}, new Object[]{sfz_field, null, Boolean.valueOf(true)}, new Object[]{sfo_field, null, "good-value"}, new Object[]{override_sfi_field, null, Integer.valueOf(10)}, new Object[]{override_sfc_field, null, Character.valueOf('c')}, new Object[]{override_sfb_field, null, Byte.valueOf((byte)1)}, new Object[]{override_sfs_field, null, Short.valueOf((short)2)}, new Object[]{override_sfl_field, null, Long.valueOf(1000)}, new Object[]{override_sfd_field, null, Double.valueOf(1.2)}, new Object[]{override_sff_field, null, Float.valueOf(2.5f)}, new Object[]{override_sfz_field, null, Boolean.valueOf(true)}, new Object[]{override_sfo_field, null, "good-value"},
};
}
/* * Test Field::set on a read-only final field. * IllegalAccessException is thrown regardless of whether the value * is of a bad type or not.
*/
@Test(dataProvider = "readOnlyFinalFields") publicvoid testSetValueOnFinalField(Field f, Object obj, Object value) {
assertTrue(Modifier.isFinal(f.getModifiers())); try {
f.set(obj, value);
fail("expected IllegalAccessException");
} catch (IllegalAccessException e) { // expected
}
// test null value only if it's primitive type try {
f.set(obj, null);
fail("expected IllegalAccessException");
} catch (IllegalAccessException e) { // expected
}
}
@DataProvider(name = "finalInstanceFields") private Object[][] finalInstanceFields() { returnnew Object[][]{ new Object[]{fi_field, Integer.valueOf(10)}, new Object[]{fc_field, Character.valueOf('c')}, new Object[]{fb_field, Byte.valueOf((byte) 1)}, new Object[]{fs_field, Short.valueOf((short) 2)}, new Object[]{fl_field, Long.valueOf(1000)}, new Object[]{fd_field, Double.valueOf(1.2)}, new Object[]{ff_field, Float.valueOf(2.5f)}, new Object[]{fz_field, Boolean.valueOf(true)}, new Object[]{fo_field, "good-value"},
};
}
/* * Test Field::set on a final instance field with either a bad receiver * or null. IllegalArgumentException is thrown if the receiver is of * a bad type. NullPointerException is thrown if the receiver is null. * The receiver is checked before the access check is performed and * also before the value is checked.
*/
@Test(dataProvider = "finalInstanceFields") publicvoid testReceiverOnFinalField(Field f, Object value) {
assertTrue(Modifier.isFinal(f.getModifiers()));
Object badReceiver = new NegativeTest(); // set the field with a bad receiver with a good value try {
f.set(badReceiver, value);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) { // expected
} catch (IllegalAccessException e) { thrownew RuntimeException("Expected IllegalArgumentException but got: " + e.getMessage(), e);
}
// set the field with a bad receiver with a bad value
Object badValue = new NegativeTest(); try {
f.set(badReceiver, badValue);
fail("expected IllegalArgumentException");
} catch (IllegalArgumentException e) { // expected
} catch (IllegalAccessException e) { thrownew RuntimeException("Expected IllegalArgumentException but got: " + e.getMessage(), e);
}
// set the field with a null receiver with a good value try {
f.set(null, value);
fail("expected NullPointerException");
} catch (NullPointerException e) { // expected
} catch (IllegalAccessException e) { thrownew RuntimeException("Expected NullPointerException but got: " + e.getMessage(), e);
} // set the field with a null receiver with a bad value try {
f.set(null, badValue);
fail("expected NullPointerException");
} catch (NullPointerException e) { // expected
} catch (IllegalAccessException e) { thrownew RuntimeException("Expected NullPointerException but got: " + e.getMessage(), e);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.