Path: blob/master/test/jdk/java/lang/ModuleTests/access/src/test/test/Main.java
41921 views
/*1* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223package test;2425import java.lang.reflect.AccessibleObject;26import java.lang.reflect.Constructor;27import java.lang.reflect.Field;28import java.lang.reflect.Method;2930/**31* Test access to public/non-public members of public/non-public classes in32* exported and non-exported packages.33*/3435public class Main {3637public static void main(String[] args) throws Exception {38testPublicClassInExportedPackage();39testNonPublicClassInExportedPackage();40testPublicClassInNonExportedPackage();41testNonPublicClassInNonExportedPackage();42}4344static void testPublicClassInExportedPackage() throws Exception {45Module thisModule = Main.class.getModule();46Module targetModule = getTargetModule();4748assertTrue(targetModule.isExported("p1"));49assertTrue(targetModule.isExported("p1", thisModule));50assertTrue(targetModule.isExported("p1", targetModule));5152assertFalse(targetModule.isOpen("p1"));53assertFalse(targetModule.isOpen("p1", thisModule));54assertTrue(targetModule.isOpen("p1", targetModule));5556Class<?> clazz = Class.forName("p1.Public");57Constructor<?> ctor1 = clazz.getConstructor(); // public58Constructor<?> ctor2 = clazz.getDeclaredConstructor(Void.class); // non-public5960Field f1 = clazz.getField("f1"); // public61Field f2 = clazz.getDeclaredField("f2"); // non-public6263Method m1 = clazz.getMethod("foo"); // public64Method m2 = clazz.getDeclaredMethod("bar"); // non-public6566tryAccessConstructor(ctor1, true);67tryAccessConstructor(ctor2, false);68tryAccessMethod(m1, true);69tryAccessMethod(m2, false);70tryAccessObjectField(f1, true);71tryAccessObjectField(f2, false);7273trySetAccessible(ctor1, true);74trySetAccessible(ctor2, false);75trySetAccessible(m1, true);76trySetAccessible(m2, false);77trySetAccessible(f1, true);78trySetAccessible(f2, false);7980targetAddOpens("p1", thisModule);8182tryAccessConstructor(ctor1, true);83tryAccessConstructor(ctor2, false);84tryAccessMethod(m1, true);85tryAccessMethod(m2, false);86tryAccessObjectField(f1, true);87tryAccessObjectField(f2, false);8889trySetAccessible(ctor1, true);90trySetAccessible(ctor2, true);91trySetAccessible(m1, true);92trySetAccessible(m2, true);93trySetAccessible(f1, true);94trySetAccessible(f2, true);95}9697static void testNonPublicClassInExportedPackage() throws Exception {98Module thisModule = Main.class.getModule();99Module targetModule = getTargetModule();100101assertTrue(targetModule.isExported("p2"));102assertTrue(targetModule.isExported("p2", thisModule));103assertTrue(targetModule.isExported("p2", targetModule));104105assertFalse(targetModule.isOpen("p2"));106assertFalse(targetModule.isOpen("p2", thisModule));107assertTrue(targetModule.isOpen("p1", targetModule));108109Class<?> clazz = Class.forName("p2.NonPublic");110Constructor<?> ctor1 = clazz.getConstructor();111Constructor<?> ctor2 = clazz.getDeclaredConstructor(Void.class);112113Field f1 = clazz.getField("f1"); // public114Field f2 = clazz.getDeclaredField("f2"); // non-public115116Method m1 = clazz.getMethod("foo"); // public117Method m2 = clazz.getDeclaredMethod("bar"); // non-public118119tryAccessConstructor(ctor1, false);120tryAccessConstructor(ctor2, false);121tryAccessMethod(m1, false);122tryAccessMethod(m2, false);123tryAccessObjectField(f1, false);124tryAccessObjectField(f2, false);125126trySetAccessible(ctor1, false);127trySetAccessible(ctor2, false);128trySetAccessible(m1, false);129trySetAccessible(m2, false);130trySetAccessible(f1, false);131trySetAccessible(f2, false);132133targetAddExports("p2", thisModule);134135tryAccessConstructor(ctor1, false);136tryAccessConstructor(ctor2, false);137tryAccessMethod(m1, false);138tryAccessMethod(m2, false);139tryAccessObjectField(f1, false);140tryAccessObjectField(f2, false);141142trySetAccessible(ctor1, false);143trySetAccessible(ctor2, false);144trySetAccessible(m1, false);145trySetAccessible(m2, false);146trySetAccessible(f1, false);147trySetAccessible(f2, false);148149targetAddOpens("p2", thisModule);150151tryAccessConstructor(ctor1, false);152tryAccessConstructor(ctor2, false);153tryAccessMethod(m1, false);154tryAccessMethod(m2, false);155tryAccessObjectField(f1, false);156tryAccessObjectField(f2, false);157158trySetAccessible(ctor1, true);159trySetAccessible(ctor2, true);160trySetAccessible(m1, true);161trySetAccessible(m2, true);162trySetAccessible(f1, true);163trySetAccessible(f2, true);164}165166static void testPublicClassInNonExportedPackage() throws Exception {167Module thisModule = Main.class.getModule();168Module targetModule = getTargetModule();169170assertFalse(targetModule.isExported("q1"));171assertFalse(targetModule.isExported("q1", thisModule));172assertTrue(targetModule.isExported("q1", targetModule));173174assertFalse(targetModule.isOpen("q1"));175assertFalse(targetModule.isOpen("q1", thisModule));176assertTrue(targetModule.isOpen("q1", targetModule));177178Class<?> clazz = Class.forName("q1.Public");179Constructor<?> ctor1 = clazz.getConstructor(); // public180Constructor<?> ctor2 = clazz.getDeclaredConstructor(Void.class); // non-public181182Field f1 = clazz.getField("f1"); // public183Field f2 = clazz.getDeclaredField("f2"); // non-public184185Method m1 = clazz.getMethod("foo"); // public186Method m2 = clazz.getDeclaredMethod("bar"); // non-public187188tryAccessConstructor(ctor1, false);189tryAccessConstructor(ctor2, false);190tryAccessMethod(m1, false);191tryAccessMethod(m2, false);192tryAccessObjectField(f1, false);193tryAccessObjectField(f2, false);194195trySetAccessible(ctor1, false);196trySetAccessible(ctor2, false);197trySetAccessible(m1, false);198trySetAccessible(m2, false);199trySetAccessible(f1, false);200trySetAccessible(f2, false);201202targetAddExports("q1", thisModule);203204tryAccessConstructor(ctor1, true);205tryAccessConstructor(ctor2, false);206tryAccessMethod(m1, true);207tryAccessMethod(m2, false);208tryAccessObjectField(f1, true);209tryAccessObjectField(f2, false);210211trySetAccessible(ctor1, true);212trySetAccessible(ctor2, false);213trySetAccessible(m1, true);214trySetAccessible(m2, false);215trySetAccessible(f1, true);216trySetAccessible(f2, false);217218targetAddOpens("q1", thisModule);219220tryAccessConstructor(ctor1, true);221tryAccessConstructor(ctor1, false);222tryAccessMethod(m1, true);223tryAccessMethod(m2, false);224tryAccessObjectField(f1, true);225tryAccessObjectField(f2, false);226227trySetAccessible(ctor1, true);228trySetAccessible(ctor2, true);229trySetAccessible(m1, true);230trySetAccessible(m2, true);231trySetAccessible(f1, true);232trySetAccessible(f2, true);233}234235static void testNonPublicClassInNonExportedPackage() throws Exception {236Module thisModule = Main.class.getModule();237Module targetModule = getTargetModule();238239assertFalse(targetModule.isExported("q2"));240assertFalse(targetModule.isExported("q2", thisModule));241assertTrue(targetModule.isExported("q2", targetModule));242243assertFalse(targetModule.isOpen("q2"));244assertFalse(targetModule.isOpen("q2", thisModule));245assertTrue(targetModule.isOpen("q2", targetModule));246247Class<?> clazz = Class.forName("q2.NonPublic");248Constructor<?> ctor1 = clazz.getConstructor(); // public249Constructor<?> ctor2 = clazz.getDeclaredConstructor(Void.class); // non-public250251Field f1 = clazz.getField("f1"); // public252Field f2 = clazz.getDeclaredField("f2"); // non-public253254Method m1 = clazz.getMethod("foo"); // public255Method m2 = clazz.getDeclaredMethod("bar"); // non-public256257tryAccessConstructor(ctor1, false);258tryAccessConstructor(ctor2, false);259tryAccessMethod(m1, false);260tryAccessMethod(m2, false);261tryAccessObjectField(f1, false);262tryAccessObjectField(f2, false);263264trySetAccessible(ctor1, false);265trySetAccessible(ctor2, false);266trySetAccessible(m1, false);267trySetAccessible(m2, false);268trySetAccessible(f1, false);269trySetAccessible(f2, false);270271targetAddExports("q2", thisModule);272273tryAccessConstructor(ctor1, false);274tryAccessConstructor(ctor2, false);275tryAccessMethod(m1, false);276tryAccessMethod(m2, false);277tryAccessObjectField(f1, false);278tryAccessObjectField(f2, false);279280trySetAccessible(ctor1, false);281trySetAccessible(ctor2, false);282trySetAccessible(m1, false);283trySetAccessible(m2, false);284trySetAccessible(f1, false);285trySetAccessible(f2, false);286287targetAddOpens("q2", thisModule);288289tryAccessConstructor(ctor1, false);290tryAccessConstructor(ctor2, false);291tryAccessMethod(m1, false);292tryAccessMethod(m2, false);293tryAccessObjectField(f1, false);294tryAccessObjectField(f2, false);295296trySetAccessible(ctor1, true);297trySetAccessible(m1, true);298trySetAccessible(m2, true);299trySetAccessible(f1, true);300trySetAccessible(f2, true);301}302303304static Module getTargetModule() {305return ModuleLayer.boot().findModule("target").get();306}307308static void tryAccessConstructor(Constructor<?> ctor, boolean shouldSucceed) {309try {310ctor.newInstance();311assertTrue(shouldSucceed);312} catch (Exception e) {313assertFalse(shouldSucceed);314}315}316317static void tryAccessMethod(Method method, boolean shouldSucceed) {318try {319method.invoke(null);320assertTrue(shouldSucceed);321} catch (Exception e) {322e.printStackTrace();323assertFalse(shouldSucceed);324}325}326327static void tryAccessObjectField(Field f, boolean shouldSucceed) {328try {329f.get(null);330assertTrue(shouldSucceed);331} catch (Exception e) {332assertFalse(shouldSucceed);333}334try {335f.set(null, new Object());336assertTrue(shouldSucceed);337} catch (Exception e) {338assertFalse(shouldSucceed);339}340}341342static void trySetAccessible(AccessibleObject ao, boolean shouldSucceed) {343try {344ao.setAccessible(true);345assertTrue(shouldSucceed);346} catch (Exception e) {347assertFalse(shouldSucceed);348}349}350351/**352* Update target module to export a package to the given module.353*/354static void targetAddExports(String pn, Module who) throws Exception {355Class<?> helper = Class.forName("p1.Helper");356Method m = helper.getMethod("addExports", String.class, Module.class);357m.invoke(null, pn, who);358}359360/**361* Update target module to open a package to the given module.362*/363static void targetAddOpens(String pn, Module who) throws Exception {364Class<?> helper = Class.forName("p1.Helper");365Method m = helper.getMethod("addOpens", String.class, Module.class);366m.invoke(null, pn, who);367}368369static void assertTrue(boolean expr) {370if (!expr) throw new RuntimeException();371}372373static void assertFalse(boolean expr) {374assertTrue(!expr);375}376}377378379