/* * Copyright (c) 2019, 2020, 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 8246774 * @summary Ensures basic behavior of cycles from record components * @run testng CycleTest * @run testng/othervm/java.security.policy=empty_security.policy CycleTest
*/
record R (int x, int y, C c) implements Serializable { }
staticclass C implements Serializable {
Object obj; // mutable
}
/** * Deserialization of a record object, r, does not support references to r, * from any of r's components. All references will be null.
*/
@Test publicvoid testCycle1() throws Exception {
out.println("\n---");
C c = new C();
R r = new R(1, 2, c);
c.obj = r; // cycle, targeting record r
/** * An object, c, reconstructed before the record, r, can be referenced from * a record component. It's a cycle, from within the record, but the record, * r, is not the target.
*/
@Test publicvoid testCycle2() throws Exception {
out.println("\n---");
C c = new C();
R r = new R(3, 4, c);
c.obj = r; // cycle, serializing c first should preserve the cycle
record R2 (int x, int y, C c1, C c2) implements Serializable { }
/** * Cycles, of non-record objects, within record components should be fine.
*/
@Test publicvoid testCycle3() throws Exception {
out.println("\n---");
C c1 = new C();
C c2 = new C();
c1.obj = c2; // --\-- cycle
c2.obj = c1; // \- cycle
R2 r = new R2(5, 6, c1, c2);
record R3 (long l, R r) implements Serializable { }
/** * Deserialization of a record object, r, ( with a cycle ), should still * deserialize from within a record, r3.
*/
@Test publicvoid testCycle4() throws Exception {
out.println("\n---");
C c = new C();
R r = new R(7, 8, c);
c.obj = r; // cycle, targeting record r
R3 r3 = new R3(9, r); // record within a record
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.