< prev index next >
src/java.base/share/classes/java/lang/Class.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 1994, 2017, 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. Oracle designates this
--- 1,7 ----
/*
! * Copyright (c) 1994, 2018, 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. Oracle designates this
*** 3853,3882 ****
* is a member of the nest consisting only of itself, and is the
* nest host. Every class and interface is a member of exactly one nest.
*
* @return the nest host of this class, or {@code this} if we cannot
* obtain a valid nest host
! *
* @since 11
*/
public Class<?> getNestHost() {
if (isPrimitive() || isArray()) {
return this;
}
try {
! Class<?> host = getNestHost0();
! // if null then nest membership validation failed, so we
! // act as-if we have no nest-host
! if (host == null) {
! host = this;
! }
! return host;
} catch (LinkageError e) {
// if we couldn't load our nest-host then we
! // again act as-if we have no nest-host
return this;
}
}
/**
* Determines if the given {@code Class} is a nestmate of the
* object represented by this {@code Class}. Two classes are nestmates
--- 3853,3895 ----
* is a member of the nest consisting only of itself, and is the
* nest host. Every class and interface is a member of exactly one nest.
*
* @return the nest host of this class, or {@code this} if we cannot
* obtain a valid nest host
! * @throws SecurityException
! * If a security manager, <i>s</i>, is present and the caller's
! * class loader is not the same as or an ancestor of the class
! * loader for the current class and invocation of {@link
! * SecurityManager#checkPackageAccess s.checkPackageAccess()}
! * denies access to the package of the current class
* @since 11
*/
+ @CallerSensitive
public Class<?> getNestHost() {
if (isPrimitive() || isArray()) {
return this;
}
+ Class<?> host;
try {
! host = getNestHost0();
} catch (LinkageError e) {
// if we couldn't load our nest-host then we
! // act as-if we have no nest-host
! return this;
! }
! // if null then nest membership validation failed, so we
! // act as-if we have no nest-host
! if (host == null || host == this) {
return this;
}
+ // returning a different class requires a security check
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ checkPackageAccess(sm,
+ ClassLoader.getClassLoader(Reflection.getCallerClass()), true);
+ }
+ return host;
}
/**
* Determines if the given {@code Class} is a nestmate of the
* object represented by this {@code Class}. Two classes are nestmates
*** 3887,3900 ****
* nest; and {@code false} otherwise.
*
* @since 11
*/
public boolean isNestmateOf(Class<?> c) {
! // We could use Reflection.areNestmates(this, c) and ignore
! // any IllegalAccessError, but prefer to minimize exception
! // creation by using getNestHost() directly.
! return getNestHost() == c.getNestHost();
}
private native Class<?>[] getNestMembers0();
/**
--- 3900,3921 ----
* nest; and {@code false} otherwise.
*
* @since 11
*/
public boolean isNestmateOf(Class<?> c) {
! if (this == c) {
! return true;
! }
! if (isPrimitive() || isArray() ||
! c.isPrimitive() || c.isArray()) {
! return false;
! }
! try {
! return getNestHost0() == c.getNestHost0();
! } catch (LinkageError e) {
! return false;
! }
}
private native Class<?>[] getNestMembers0();
/**
*** 3915,3931 ****
* are present.
*
* @return an array of all classes and interfaces in the same nest as
* this class
*
! * @throws LinkageError if there is any problem loading or validating
! * a nest member or its nest host
*
* @since 11
*/
public Class<?>[] getNestMembers() {
if (isPrimitive() || isArray()) {
return new Class<?>[] { this };
}
! return getNestMembers0();
}
}
--- 3936,3970 ----
* are present.
*
* @return an array of all classes and interfaces in the same nest as
* this class
*
! * @throws LinkageError
! * If there is any problem loading or validating a nest member or
! * its nest host
! * @throws SecurityException
! * If a security manager, <i>s</i>, is present and the caller's
! * class loader is not the same as or an ancestor of the class
! * loader for the current class and invocation of {@link
! * SecurityManager#checkPackageAccess s.checkPackageAccess()}
! * denies access to the package of the current class
*
* @since 11
*/
+ @CallerSensitive
public Class<?>[] getNestMembers() {
if (isPrimitive() || isArray()) {
return new Class<?>[] { this };
}
! Class<?>[] members = getNestMembers0();
! if (members.length > 1) {
! // If we return anything other than the current class we need
! // a security check
! SecurityManager sm = System.getSecurityManager();
! if (sm != null) {
! checkPackageAccess(sm,
! ClassLoader.getClassLoader(Reflection.getCallerClass()), true);
! }
! }
! return members;
}
}
< prev index next >