< prev index next >
src/java.base/share/classes/java/lang/Class.java
Print this page
*** 423,432 ****
--- 423,433 ----
* {@link ModuleReader#open(String)} to read the bytes of a class file
* in a module.</li>
* </ul>
*
* @since 9
+ * @spec JPMS
*/
@CallerSensitive
public static Class<?> forName(Module module, String name) {
Objects.requireNonNull(module);
Objects.requireNonNull(name);
*** 817,826 ****
--- 818,828 ----
* loader for this class is returned.
*
* @return the module that this class or interface is a member of
*
* @since 9
+ * @spec JPMS
*/
public Module getModule() {
return module;
}
*** 922,931 ****
--- 924,935 ----
*
* <p>If this class represents an array type, a primitive type or void,
* this method returns {@code null}.
*
* @return the package of this class.
+ * @revised 9
+ * @spec JPMS
*/
public Package getPackage() {
if (isPrimitive() || isArray()) {
return null;
}
*** 949,972 ****
* #isAnonymousClass() anonymous class}, then this method is equivalent to
* invoking {@code getPackageName()} on the {@link #getDeclaringClass
* declaring class} of the {@link #getEnclosingMethod enclosing method} or
* {@link #getEnclosingConstructor enclosing constructor}.
*
! * <p> This method returns {@code null} if this class represents an array type,
! * a primitive type or void.
*
* @return the fully qualified package name
*
* @since 9
* @jls 6.7 Fully Qualified Names
*/
public String getPackageName() {
String pn = this.packageName;
! if (pn == null && !isArray() && !isPrimitive()) {
! String cn = getName();
int dot = cn.lastIndexOf('.');
pn = (dot != -1) ? cn.substring(0, dot).intern() : "";
this.packageName = pn;
}
return pn;
}
--- 953,986 ----
* #isAnonymousClass() anonymous class}, then this method is equivalent to
* invoking {@code getPackageName()} on the {@link #getDeclaringClass
* declaring class} of the {@link #getEnclosingMethod enclosing method} or
* {@link #getEnclosingConstructor enclosing constructor}.
*
! * <p> If this class represents an array type then this method returns the
! * package name of the element type. If this class represents a primitive
! * type or void then the package name "{@code java.lang}" is returned.
*
* @return the fully qualified package name
*
* @since 9
+ * @spec JPMS
* @jls 6.7 Fully Qualified Names
*/
public String getPackageName() {
String pn = this.packageName;
! if (pn == null) {
! Class<?> c = this;
! while (c.isArray()) {
! c = c.getComponentType();
! }
! if (c.isPrimitive()) {
! pn = "java.lang";
! } else {
! String cn = c.getName();
int dot = cn.lastIndexOf('.');
pn = (dot != -1) ? cn.substring(0, dot).intern() : "";
+ }
this.packageName = pn;
}
return pn;
}
*** 2489,2513 ****
/**
* Finds a resource with a given name.
*
* <p> If this class is in a named {@link Module Module} then this method
! * will attempt to find the resource in the module by means of the absolute
! * resource name, subject to the rules for encapsulation specified in the
! * {@code Module} {@link Module#getResourceAsStream getResourceAsStream}
! * method.
*
* <p> Otherwise, if this class is not in a named module then the rules for
* searching resources associated with a given class are implemented by the
* defining {@linkplain ClassLoader class loader} of the class. This method
* delegates to this object's class loader. If this object was loaded by
* the bootstrap class loader, the method delegates to {@link
* ClassLoader#getSystemResourceAsStream}.
*
! * <p> Before finding a resource in the caller's module or delegation to a
! * class loader, an absolute resource name is constructed from the given
! * resource name using this algorithm:
*
* <ul>
*
* <li> If the {@code name} begins with a {@code '/'}
* (<code>'\u002f'</code>), then the absolute name of the resource is the
--- 2503,2532 ----
/**
* Finds a resource with a given name.
*
* <p> If this class is in a named {@link Module Module} then this method
! * will attempt to find the resource in the module. This is done by
! * delegating to the module's class loader {@link
! * ClassLoader#findResource(String,String) findResource(String,String)}
! * method, invoking it with the module name and the absolute name of the
! * resource. Resources in named modules are subject to the rules for
! * encapsulation specified in the {@code Module} {@link
! * Module#getResourceAsStream getResourceAsStream} method and so this
! * method returns {@code null} when the resource is a
! * non-"{@code .class}" resource in a package that is not open to the
! * caller's module.
*
* <p> Otherwise, if this class is not in a named module then the rules for
* searching resources associated with a given class are implemented by the
* defining {@linkplain ClassLoader class loader} of the class. This method
* delegates to this object's class loader. If this object was loaded by
* the bootstrap class loader, the method delegates to {@link
* ClassLoader#getSystemResourceAsStream}.
*
! * <p> Before delegation, an absolute resource name is constructed from the
! * given resource name using this algorithm:
*
* <ul>
*
* <li> If the {@code name} begins with a {@code '/'}
* (<code>'\u002f'</code>), then the absolute name of the resource is the
*** 2530,2540 ****
--- 2549,2563 ----
* resource with this name is found, the resource is in a package
* that is not {@link Module#isOpen(String, Module) open} to at
* least the caller module, or access to the resource is denied
* by the security manager.
* @throws NullPointerException If {@code name} is {@code null}
+ *
+ * @see Module#getResourceAsStream(String)
* @since 1.1
+ * @revised 9
+ * @spec JPMS
*/
@CallerSensitive
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
*** 2583,2596 ****
/**
* Finds a resource with a given name.
*
* <p> If this class is in a named {@link Module Module} then this method
! * will attempt to find the resource in the module by means of the absolute
! * resource name, subject to the rules for encapsulation specified in the
! * {@code Module} {@link Module#getResourceAsStream getResourceAsStream}
! * method.
*
* <p> Otherwise, if this class is not in a named module then the rules for
* searching resources associated with a given class are implemented by the
* defining {@linkplain ClassLoader class loader} of the class. This method
* delegates to this object's class loader. If this object was loaded by
--- 2606,2625 ----
/**
* Finds a resource with a given name.
*
* <p> If this class is in a named {@link Module Module} then this method
! * will attempt to find the resource in the module. This is done by
! * delegating to the module's class loader {@link
! * ClassLoader#findResource(String,String) findResource(String,String)}
! * method, invoking it with the module name and the absolute name of the
! * resource. Resources in named modules are subject to the rules for
! * encapsulation specified in the {@code Module} {@link
! * Module#getResourceAsStream getResourceAsStream} method and so this
! * method returns {@code null} when the resource is a
! * non-"{@code .class}" resource in a package that is not open to the
! * caller's module.
*
* <p> Otherwise, if this class is not in a named module then the rules for
* searching resources associated with a given class are implemented by the
* defining {@linkplain ClassLoader class loader} of the class. This method
* delegates to this object's class loader. If this object was loaded by
*** 2625,2634 ****
--- 2654,2665 ----
* {@link Module#isOpen(String, Module) open} to at least the caller
* module, or access to the resource is denied by the security
* manager.
* @throws NullPointerException If {@code name} is {@code null}
* @since 1.1
+ * @revised 9
+ * @spec JPMS
*/
@CallerSensitive
public URL getResource(String name) {
name = resolveName(name);
< prev index next >