diff options
author | Brian Jones <cbj@gnu.org> | 2003-04-04 03:54:10 +0000 |
---|---|---|
committer | Brian Jones <cbj@gnu.org> | 2003-04-04 03:54:10 +0000 |
commit | 5a949371371ca5897e98ed32de358835907de4dd (patch) | |
tree | a43924b1486cb6d0b3806936d81e1cec8d974a6d /vm | |
parent | 672e2b3c498f03d8402b5acd22ed3c88f862c9c1 (diff) | |
download | classpath-5a949371371ca5897e98ed32de358835907de4dd.tar.gz |
* vm/reference/java/lang/VMClass.java: new file
* vm/reference/java/lang/Class.java: moved to java/lang
* java/lang/Class.java: added transient reference to VMClass
(Class): added call to static VMClass.getInstance()
(forName(String)): calls VMClass.forName and if that returns null
then performs the previous method call instead
(isInstance): moved to VMClass
(isAssignableFrom): moved to VMClass
(isInterface): moved to VMClass
(isArray): calls VMClass.isArray before returning to getName()
based implementation
(isPrimitive): moved to VMClass
(getName): moved to VMClass
(getSuperclass): moved to VMClass
(getInterfaces): moved to VMClass
(getComponentType): moved to VMClass
(getModifiers): moved to VMClass
(getSigners): return a clone of the signers array
(memberAccessCheck): new method
(getDeclaringClass): moved to VMClass
(getClasses): calls internalGetClasses
(internalGetClasses): new method
(getFields): calls internalGetFields
(internalGetFields): new method
(getMethods): calls internalGetMethods
(internalGetMethods): new method
(getConstructors): calls getDeclaredConstructors
(getField): calls getDeclaredFields
(getMethod): calls getDeclaredMethods
(matchMethod): new method
(matchParameters): new method
(getConstructor): calls getDeclaredConstructors
(getDeclaredClasses): calls getDeclaredClasses(boolean)
(getDeclaredClasses(boolean)): new method
(getDeclaredFields): calls getDeclaredFields(boolean)
(getDeclaredFields(boolean)): new method
(getDeclaredMethods): calls getDeclaredMethods(boolean)
(getDeclaredMethods(boolean)): new method
(getDeclaredConstructors): calls getDeclaredConstructors(boolean)
(getDeclaredConstructors(boolean)): new method
(getDeclaredField): calls getDeclaredFields
(getDeclaredMethod): calls getDeclaredMethods
(getDeclaredConstructor): calls getDeclaredConstructors
(getClassLoader0): removed
* NEWS: note changes to Class
* gnu/classpath/RawData: new file (from libgcj)
* java/lang/Makefile.am: add Class.java to dist
* vm/reference/java/lang/Makefile.am: add VMClass.java to dist,
remove Class.java
Diffstat (limited to 'vm')
-rwxr-xr-x | vm/reference/java/lang/Class.java | 883 | ||||
-rw-r--r-- | vm/reference/java/lang/Makefile.am | 2 | ||||
-rw-r--r-- | vm/reference/java/lang/VMClass.java | 342 |
3 files changed, 343 insertions, 884 deletions
diff --git a/vm/reference/java/lang/Class.java b/vm/reference/java/lang/Class.java deleted file mode 100755 index de2b5b240..000000000 --- a/vm/reference/java/lang/Class.java +++ /dev/null @@ -1,883 +0,0 @@ -/* Class.java -- Reference implementation of access to object metadata - Copyright (C) 1998, 2002 Free Software Foundation - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath 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 for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -02111-1307 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package java.lang; - -import java.io.Serializable; -import java.io.InputStream; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.security.AllPermission; -import java.security.Permissions; -import java.security.ProtectionDomain; -import gnu.java.lang.ClassHelper; - -/* - * This class is a reference version, mainly for compiling a class library - * jar. It is likely that VM implementers replace this with their own - * version that can communicate effectively with the VM. - */ - -/** - * A Class represents a Java type. There will never be multiple Class - * objects with identical names and ClassLoaders. Primitive types, array - * types, and void also have a Class object. - * - * <p>Arrays with identical type and number of dimensions share the same - * class (and null "system" ClassLoader, incidentally). The name of an - * array class is <code>[<signature format>;</code> ... for example, - * String[]'s class is <code>[Ljava.lang.String;</code>. boolean, byte, - * short, char, int, long, float and double have the "type name" of - * Z,B,S,C,I,J,F,D for the purposes of array classes. If it's a - * multidimensioned array, the same principle applies: - * <code>int[][][]</code> == <code>[[[I</code>. - * - * <p>There is no public constructor - Class objects are obtained only through - * the virtual machine, as defined in ClassLoaders. - * - * @serialData Class objects serialize specially: - * <code>TC_CLASS ClassDescriptor</code>. For more serialization information, - * see {@link ObjectStreamClass}. - * - * @author John Keiser - * @author Eric Blake <ebb9@email.byu.edu> - * @since 1.0 - * @see ClassLoader - */ -public final class Class implements Serializable -{ - /** - * Compatible with JDK 1.0+. - */ - private static final long serialVersionUID = 3206093459760846163L; - - /** The class signers. */ - private Object[] signers = null; - /** The class protection domain. */ - private ProtectionDomain pd = null; - - /** The unknown protection domain. */ - private final static ProtectionDomain unknownProtectionDomain; - static - { - Permissions permissions = new Permissions(); - permissions.add(new AllPermission()); - unknownProtectionDomain = new ProtectionDomain(null, permissions); - } - - /** - * Class is non-instantiable from Java code; only the VM can create - * instances of this class. - */ - private Class() - { - } - - /** - * Return the human-readable form of this Object. For an object, this - * is either "interface " or "class " followed by <code>getName()</code>, - * for primitive types and void it is just <code>getName()</code>. - * - * @return the human-readable form of this Object - */ - public String toString() - { - if (isPrimitive()) - return getName(); - return (isInterface() ? "interface " : "class ") + getName(); - } - - /** - * Use the classloader of the current class to load, link, and initialize - * a class. This is equivalent to your code calling - * <code>Class.forName(name, true, getClass().getClassLoader())</code>. - * - * @param name the name of the class to find - * @return the Class object representing the class - * @throws ClassNotFoundException if the class was not found by the - * classloader - * @throws LinkageError if linking the class fails - * @throws ExceptionInInitializerError if the class loads, but an exception - * occurs during initialization - */ - //XXX This does not need to be native. - public static native Class forName(String name) - throws ClassNotFoundException; - /* - { - return forName(name, true, - VMSecurityManager.getClassContext()[1].getClassLoader()); - } - */ - - /** - * Use the specified classloader to load and link a class. If the loader - * is null, this uses the bootstrap class loader (provide the security - * check succeeds). Unfortunately, this method cannot be used to obtain - * the Class objects for primitive types or for void, you have to use - * the fields in the appropriate java.lang wrapper classes. - * - * <p>Calls <code>classloader.loadclass(name, initialize)</code>. - * - * @param name the name of the class to find - * @param initialize whether or not to initialize the class at this time - * @param classloader the classloader to use to find the class; null means - * to use the bootstrap class loader - * @throws ClassNotFoundException if the class was not found by the - * classloader - * @throws LinkageError if linking the class fails - * @throws ExceptionInInitializerError if the class loads, but an exception - * occurs during initialization - * @throws SecurityException if the <code>classloader</code> argument - * is <code>null</code> and the caller does not have the - * <code>RuntimePermission("getClassLoader")</code> permission - * @see ClassLoader - * @since 1.2 - */ - public static Class forName(String name, boolean initialize, - ClassLoader classloader) - throws ClassNotFoundException - { - if (classloader == null) - { - // Check if we may access the bootstrap classloader - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - // Get the calling class and classloader - Class c = VMSecurityManager.getClassContext()[1]; - ClassLoader cl = c.getClassLoader(); - if (cl != null) - sm.checkPermission(new RuntimePermission("getClassLoader")); - } - Class c = VMClassLoader.loadClass(name, initialize); - if (c != null) - return c; - throw new ClassNotFoundException(name); - } - return classloader.loadClass(name, initialize); - } - - /** - * Get a new instance of this class by calling the no-argument constructor. - * The class is initialized if it has not been already. A security check - * may be performed, with <code>checkMemberAccess(this, Member.PUBLIC)</code> - * as well as <code>checkPackageAccess</code> both having to succeed. - * - * @return a new instance of this class - * @throws InstantiationException if there is not a no-arg constructor - * for this class, including interfaces, abstract classes, arrays, - * primitive types, and void; or if an exception occurred during - * the constructor - * @throws IllegalAccessException if you are not allowed to access the - * no-arg constructor because of scoping reasons - * @throws SecurityException if the security check fails - * @throws ExceptionInInitializerError if class initialization caused by - * this call fails with an exception - */ - public Object newInstance() - throws InstantiationException, IllegalAccessException - { - try - { - return getConstructor(null).newInstance(null); - } - catch (IllegalArgumentException e) - { - throw (Error) new InternalError("Should not happen").initCause(e); - } - catch (InvocationTargetException e) - { - throw (InstantiationException) - new InstantiationException(e.toString()).initCause(e); - } - catch (NoSuchMethodException e) - { - throw (InstantiationException) - new InstantiationException(e.toString()).initCause(e); - } - } - - /** - * Discover whether an Object is an instance of this Class. Think of it - * as almost like <code>o instanceof (this class)</code>. - * - * @param o the Object to check - * @return whether o is an instance of this class - * @since 1.1 - */ - public native boolean isInstance(Object o); - - /** - * Discover whether an instance of the Class parameter would be an - * instance of this Class as well. Think of doing - * <code>isInstance(c.newInstance())</code> or even - * <code>c.newInstance() instanceof (this class)</code>. While this - * checks widening conversions for objects, it must be exact for primitive - * types. - * - * @param c the class to check - * @return whether an instance of c would be an instance of this class - * as well - * @throws NullPointerException if c is null - * @since 1.1 - */ - public native boolean isAssignableFrom(Class c); - - /** - * Check whether this class is an interface or not. Array types are not - * interfaces. - * - * @return whether this class is an interface or not - */ - public native boolean isInterface(); - - /** - * Return whether this class is an array type. - * - * @return whether this class is an array type - * @since 1.1 - */ - public boolean isArray() - { - return getName().charAt(0) == '['; - } - - /** - * Return whether this class is a primitive type. A primitive type class - * is a class representing a kind of "placeholder" for the various - * primitive types, or void. You can access the various primitive type - * classes through java.lang.Boolean.TYPE, java.lang.Integer.TYPE, etc., - * or through boolean.class, int.class, etc. - * - * @return whether this class is a primitive type - * @see Boolean#TYPE - * @see Byte#TYPE - * @see Character#TYPE - * @see Short#TYPE - * @see Integer#TYPE - * @see Long#TYPE - * @see Float#TYPE - * @see Double#TYPE - * @see Void#TYPE - * @since 1.1 - */ - public native boolean isPrimitive(); - - /** - * Get the name of this class, separated by dots for package separators. - * Primitive types and arrays are encoded as: - * <pre> - * boolean Z - * byte B - * char C - * short S - * int I - * long J - * float F - * double D - * void V - * array type [<em>element type</em> - * class or interface, alone: <dotted name> - * class or interface, as element type: L<dotten name>; - * - * @return the name of this class - */ - public native String getName(); - - /** - * Get the ClassLoader that loaded this class. If it was loaded by the - * system classloader, this method will return null. If there is a security - * manager, and the caller's class loader does not match the requested - * one, a security check of <code>RuntimePermission("getClassLoader")</code> - * must first succeed. Primitive types and void return null. - * - * @return the ClassLoader that loaded this class - * @throws SecurityException if the security check fails - * @see ClassLoader - * @see RuntimePermission - */ - public ClassLoader getClassLoader() - { - // Check some common cases. - if (isPrimitive()) - return null; - String name = getName(); - if (name.startsWith("java.") || name.startsWith("gnu.java.")) - return null; - - ClassLoader loader = getClassLoader0(); - // Check if we may get the classloader - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - { - // Get the calling class and classloader - Class c = VMSecurityManager.getClassContext()[1]; - ClassLoader cl = c.getClassLoader(); - if (cl != null && cl != ClassLoader.systemClassLoader) - sm.checkPermission(new RuntimePermission("getClassLoader")); - } - return loader; - } - - /** - * Get the direct superclass of this class. If this is an interface, - * Object, a primitive type, or void, it will return null. If this is an - * array type, it will return Object. - * - * @return the direct superclass of this class - */ - public native Class getSuperclass(); - - /** - * Returns the <code>Package</code> in which this class is defined - * Returns null when this information is not available from the - * classloader of this class or when the classloader of this class - * is null. - * - * @return the package for this class, if it is available - * @since 1.2 - */ - public Package getPackage() - { - ClassLoader cl = getClassLoader(); - if (cl != null) - return cl.getPackage(ClassHelper.getPackagePortion(getName())); - return null; - } - - /** - * Get the interfaces this class <EM>directly</EM> implements, in the - * order that they were declared. This returns an empty array, not null, - * for Object, primitives, void, and classes or interfaces with no direct - * superinterface. Array types return Cloneable and Serializable. - * - * @return the interfaces this class directly implements - */ - public native Class[] getInterfaces(); - - /** - * If this is an array, get the Class representing the type of array. - * Examples: "[[Ljava.lang.String;" would return "[Ljava.lang.String;", and - * calling getComponentType on that would give "java.lang.String". If - * this is not an array, returns null. - * - * @return the array type of this class, or null - * @see Array - * @since 1.1 - */ - public Class getComponentType() - { - if (isArray()) - try - { - String name = getName(); - switch (name.charAt(1)) - { - case 'B': - return byte.class; - case 'C': - return char.class; - case 'D': - return double.class; - case 'F': - return float.class; - case 'I': - return int.class; - case 'J': - return long.class; - case 'S': - return short.class; - case 'Z': - return boolean.class; - default: - return null; - case '[': - name = name.substring(1); - break; - case 'L': - name = name.substring(2, name.length() - 1); - } - return Class.forName(name, false, getClassLoader()); - } - catch(ClassNotFoundException e) - { - // Shouldn't happen, but ignore it anyway. - } - return null; - } - - /** - * Get the modifiers of this class. These can be decoded using Modifier, - * and is limited to one of public, protected, or private, and any of - * final, static, abstract, or interface. An array class has the same - * public, protected, or private modifier as its component type, and is - * marked final but not an interface. Primitive types and void are marked - * public and final, but not an interface. - * - * @return the modifiers of this class - * @see Modifer - * @since 1.1 - */ - public native int getModifiers(); - - /** - * Get the signers of this class. This returns null if there are no signers, - * such as for primitive types or void. - * - * @return the signers of this class - * @since 1.1 - */ - public Object[] getSigners() - { - return signers; - } - - /** - * Set the signers of this class. - * - * @param signers the signers of this class - */ - void setSigners(Object[] signers) - { - this.signers = signers; - } - - /** - * If this is a nested or inner class, return the class that declared it. - * If not, return null. - * - * @return the declaring class of this class - * @since 1.1 - */ - public native Class getDeclaringClass(); - - /** - * Get all the public member classes and interfaces declared in this - * class or inherited from superclasses. This returns an array of length - * 0 if there are no member classes, including for primitive types. A - * security check may be performed, with - * <code>checkMemberAccess(this, Member.PUBLIC)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @return all public member classes in this class - * @throws SecurityException if the security check fails - * @since 1.1 - */ - public native Class[] getClasses(); - - /** - * Get all the public fields declared in this class or inherited from - * superclasses. This returns an array of length 0 if there are no fields, - * including for primitive types. This does not return the implicit length - * field of arrays. A security check may be performed, with - * <code>checkMemberAccess(this, Member.PUBLIC)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @return all public fields in this class - * @throws SecurityException if the security check fails - * @since 1.1 - */ - public native Field[] getFields(); - - /** - * Get all the public methods declared in this class or inherited from - * superclasses. This returns an array of length 0 if there are no methods, - * including for primitive types. This does include the implicit methods of - * arrays and interfaces which mirror methods of Object, nor does it - * include constructors or the class initialization methods. The Virtual - * Machine allows multiple methods with the same signature but differing - * return types; all such methods are in the returned array. A security - * check may be performed, with - * <code>checkMemberAccess(this, Member.PUBLIC)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @return all public methods in this class - * @throws SecurityException if the security check fails - * @since 1.1 - */ - public native Method[] getMethods(); - - /** - * Get all the public constructors of this class. This returns an array of - * length 0 if there are no constructors, including for primitive types, - * arrays, and interfaces. It does, however, include the default - * constructor if one was supplied by the compiler. A security check may - * be performed, with <code>checkMemberAccess(this, Member.PUBLIC)</code> - * as well as <code>checkPackageAccess</code> both having to succeed. - * - * @return all public constructors in this class - * @throws SecurityException if the security check fails - * @since 1.1 - */ - public native Constructor[] getConstructors(); - - /** - * Get a public field declared or inherited in this class, where name is - * its simple name. If the class contains multiple accessible fields by - * that name, an arbitrary one is returned. The implicit length field of - * arrays is not available. A security check may be performed, with - * <code>checkMemberAccess(this, Member.PUBLIC)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @param name the name of the field - * @return the field - * @throws NoSuchFieldException if the field does not exist - * @throws SecurityException if the security check fails - * @see #getFields() - * @since 1.1 - */ - public native Field getField(String name) throws NoSuchFieldException; - - /** - * Get a public method declared or inherited in this class, where name is - * its simple name. The implicit methods of Object are not available from - * arrays or interfaces. Constructors (named "<init>" in the class file) - * and class initializers (name "<clinit>") are not available. The Virtual - * Machine allows multiple methods with the same signature but differing - * return types, and the class can inherit multiple methods of the same - * return type; in such a case the most specific return types are favored, - * then the final choice is arbitrary. If the method takes no argument, an - * array of zero elements and null are equivalent for the types argument. - * A security check may be performed, with - * <code>checkMemberAccess(this, Member.PUBLIC)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @param name the name of the method - * @param types the type of each parameter - * @return the method - * @throws NoSuchMethodException if the method does not exist - * @throws SecurityException if the security check fails - * @see #getMethods() - * @since 1.1 - */ - public native Method getMethod(String name, Class[] args) - throws NoSuchMethodException; - - /** - * Get a public constructor declared in this class. If the constructor takes - * no argument, an array of zero elements and null are equivalent for the - * types argument. A security check may be performed, with - * <code>checkMemberAccess(this, Member.PUBLIC)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @param types the type of each parameter - * @return the constructor - * @throws NoSuchMethodException if the constructor does not exist - * @throws SecurityException if the security check fails - * @see #getConstructors() - * @since 1.1 - */ - public native Constructor getConstructor(Class[] args) - throws NoSuchMethodException; - - /** - * Get all the declared member classes and interfaces in this class, but - * not those inherited from superclasses. This returns an array of length - * 0 if there are no member classes, including for primitive types. A - * security check may be performed, with - * <code>checkMemberAccess(this, Member.DECLARED)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @return all declared member classes in this class - * @throws SecurityException if the security check fails - * @since 1.1 - */ - public native Class[] getDeclaredClasses(); - - /** - * Get all the declared fields in this class, but not those inherited from - * superclasses. This returns an array of length 0 if there are no fields, - * including for primitive types. This does not return the implicit length - * field of arrays. A security check may be performed, with - * <code>checkMemberAccess(this, Member.DECLARED)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @return all declared fields in this class - * @throws SecurityException if the security check fails - * @since 1.1 - */ - public native Field[] getDeclaredFields(); - - /** - * Get all the declared methods in this class, but not those inherited from - * superclasses. This returns an array of length 0 if there are no methods, - * including for primitive types. This does include the implicit methods of - * arrays and interfaces which mirror methods of Object, nor does it - * include constructors or the class initialization methods. The Virtual - * Machine allows multiple methods with the same signature but differing - * return types; all such methods are in the returned array. A security - * check may be performed, with - * <code>checkMemberAccess(this, Member.DECLARED)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @return all declared methods in this class - * @throws SecurityException if the security check fails - * @since 1.1 - */ - public native Method[] getDeclaredMethods(); - - /** - * Get all the declared constructors of this class. This returns an array of - * length 0 if there are no constructors, including for primitive types, - * arrays, and interfaces. It does, however, include the default - * constructor if one was supplied by the compiler. A security check may - * be performed, with <code>checkMemberAccess(this, Member.DECLARED)</code> - * as well as <code>checkPackageAccess</code> both having to succeed. - * - * @return all constructors in this class - * @throws SecurityException if the security check fails - * @since 1.1 - */ - public native Constructor[] getDeclaredConstructors(); - - /** - * Get a field declared in this class, where name is its simple name. The - * implicit length field of arrays is not available. A security check may - * be performed, with <code>checkMemberAccess(this, Member.DECLARED)</code> - * as well as <code>checkPackageAccess</code> both having to succeed. - * - * @param name the name of the field - * @return the field - * @throws NoSuchFieldException if the field does not exist - * @throws SecurityException if the security check fails - * @see #getDeclaredFields() - * @since 1.1 - */ - public native Field getDeclaredField(String name) - throws NoSuchFieldException; - - /** - * Get a method declared in this class, where name is its simple name. The - * implicit methods of Object are not available from arrays or interfaces. - * Constructors (named "<init>" in the class file) and class initializers - * (name "<clinit>") are not available. The Virtual Machine allows - * multiple methods with the same signature but differing return types; in - * such a case the most specific return types are favored, then the final - * choice is arbitrary. If the method takes no argument, an array of zero - * elements and null are equivalent for the types argument. A security - * check may be performed, with - * <code>checkMemberAccess(this, Member.DECLARED)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @param name the name of the method - * @param types the type of each parameter - * @return the method - * @throws NoSuchMethodException if the method does not exist - * @throws SecurityException if the security check fails - * @see #getDeclaredMethods() - * @since 1.1 - */ - public native Method getDeclaredMethod(String name, Class[] args) - throws NoSuchMethodException; - - /** - * Get a constructor declared in this class. If the constructor takes no - * argument, an array of zero elements and null are equivalent for the - * types argument. A security check may be performed, with - * <code>checkMemberAccess(this, Member.DECLARED)</code> as well as - * <code>checkPackageAccess</code> both having to succeed. - * - * @param types the type of each parameter - * @return the constructor - * @throws NoSuchMethodException if the constructor does not exist - * @throws SecurityException if the security check fails - * @see #getDeclaredConstructors() - * @since 1.1 - */ - public native Constructor getDeclaredConstructor(Class[] args) - throws NoSuchMethodException; - - /** - * Get a resource using this class's package using the - * getClassLoader().getResourceAsStream() method. If this class was loaded - * using the system classloader, ClassLoader.getSystemResource() is used - * instead. - * - * <p>If the name you supply is absolute (it starts with a <code>/</code>), - * then it is passed on to getResource() as is. If it is relative, the - * package name is prepended, and <code>.</code>'s are replaced with - * <code>/</code>. - * - * <p>The URL returned is system- and classloader-dependent, and could - * change across implementations. - * - * @param name the name of the resource, generally a path - * @return an InputStream with the contents of the resource in it, or null - * @throws NullPointerException if name is null - * @since 1.1 - */ - public InputStream getResourceAsStream(String name) - { - if (name.length() > 0 && name.charAt(0) != '/') - name = ClassHelper.getPackagePortion(getName()).replace('.','/') - + "/" + name; - ClassLoader c = getClassLoader(); - if (c == null) - return ClassLoader.getSystemResourceAsStream(name); - return c.getResourceAsStream(name); - } - - /** - * Get a resource URL using this class's package using the - * getClassLoader().getResource() method. If this class was loaded using - * the system classloader, ClassLoader.getSystemResource() is used instead. - * - * <p>If the name you supply is absolute (it starts with a <code>/</code>), - * then it is passed on to getResource() as is. If it is relative, the - * package name is prepended, and <code>.</code>'s are replaced with - * <code>/</code>. - * - * <p>The URL returned is system- and classloader-dependent, and could - * change across implementations. - * - * @param name the name of the resource, generally a path - * @return the URL to the resource - * @throws NullPointerException if name is null - * @since 1.1 - */ - public URL getResource(String name) - { - if(name.length() > 0 && name.charAt(0) != '/') - name = ClassHelper.getPackagePortion(getName()).replace('.','/') - + "/" + name; - ClassLoader c = getClassLoader(); - if (c == null) - return ClassLoader.getSystemResource(name); - return c.getResource(name); - } - - /** - * Returns the protection domain of this class. If the classloader did not - * record the protection domain when creating this class the unknown - * protection domain is returned which has a <code>null</code> code source - * and all permissions. A security check may be performed, with - * <code>RuntimePermission("getProtectionDomain")</code>. - * - * @return the protection domain - * @throws SecurityException if the security check fails - * @see RuntimePermission - * @since 1.2 - */ - public ProtectionDomain getProtectionDomain() - { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(new RuntimePermission("getProtectionDomain")); - - return pd == null ? unknownProtectionDomain : pd; - } - - /** - * Returns the desired assertion status of this class, if it were to be - * initialized at this moment. The class assertion status, if set, is - * returned; the backup is the default package status; then if there is - * a class loader, that default is returned; and finally the system default - * is returned. This method seldom needs calling in user code, but exists - * for compilers to implement the assert statement. Note that there is no - * guarantee that the result of this method matches the class's actual - * assertion status. - * - * @return the desired assertion status - * @see ClassLoader#setClassAssertionStatus(String, boolean) - * @see ClassLoader#setPackageAssertionStatus(String, boolean) - * @see ClassLoader#setDefaultAssertionStatus(boolean) - * @since 1.4 - */ - public boolean desiredAssertionStatus() - { - ClassLoader c = getClassLoader(); - Object status; - if (c == null) - return VMClassLoader.defaultAssertionStatus(); - if (c.classAssertionStatus != null) - synchronized (c) - { - status = c.classAssertionStatus.get(getName()); - if (status != null) - return status.equals(Boolean.TRUE); - } - else - { - status = ClassLoader.systemClassAssertionStatus.get(getName()); - if (status != null) - return status.equals(Boolean.TRUE); - } - if (c.packageAssertionStatus != null) - synchronized (c) - { - String name = ClassHelper.getPackagePortion(getName()); - if ("".equals(name)) - status = c.packageAssertionStatus.get(null); - else - do - { - status = c.packageAssertionStatus.get(name); - name = ClassHelper.getPackagePortion(name); - } - while (! "".equals(name) && status == null); - if (status != null) - return status.equals(Boolean.TRUE); - } - else - { - String name = ClassHelper.getPackagePortion(getName()); - if ("".equals(name)) - status = ClassLoader.systemPackageAssertionStatus.get(null); - else - do - { - status = ClassLoader.systemPackageAssertionStatus.get(name); - name = ClassHelper.getPackagePortion(name); - } - while (! "".equals(name) && status == null); - if (status != null) - return status.equals(Boolean.TRUE); - } - return c.defaultAssertionStatus; - } - - /** - * Return the class loader of this class. - * - * @return the class loader - */ - native ClassLoader getClassLoader0(); -} // class Class diff --git a/vm/reference/java/lang/Makefile.am b/vm/reference/java/lang/Makefile.am index adea5830d..486c74a47 100644 --- a/vm/reference/java/lang/Makefile.am +++ b/vm/reference/java/lang/Makefile.am @@ -3,9 +3,9 @@ SUBDIRS = reflect EXTRA_DIST = \ -Class.java \ Runtime.java \ Thread.java \ +VMClass.java VMClassLoader.java \ VMObject.java \ VMSecurityManager.java \ diff --git a/vm/reference/java/lang/VMClass.java b/vm/reference/java/lang/VMClass.java new file mode 100644 index 000000000..73a891ecc --- /dev/null +++ b/vm/reference/java/lang/VMClass.java @@ -0,0 +1,342 @@ +/* VMClass.java -- VM Specific Class methods + Copyright (C) 2003 Free Software Foundation + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package java.lang; + +import gnu.classpath.RawData; + +/* + * This class is a reference version, mainly for compiling a class library + * jar. It is likely that VM implementers replace this with their own + * version that can communicate effectively with the VM. + */ + +/** + * + * @author Etienne Gagnon <etienne.gagnon@uqam.ca> + * @author Archie Cobbs <archie@dellroad.org> + * @author C. Brian Jones <cbj@gnu.org> + */ +public final class VMClass +{ + /* + * Class initialization mostly-in-Java copied from SableVM. + * The steps below follow the JVM spec, 2nd edition, sec. 2.17.5. + */ + private int initializing_thread; + private boolean erroneous_state; + + private native boolean isInitialized(); + private native void setInitialized(); + private native void step7(); + private native void step8(); + + /** + * Pointer to VM internal class structure. + */ + + private final RawData vmData; + + private VMClass(RawData vmData) + { + this.vmData = vmData; + } + + static native VMClass getInstance(); + + private void initialize(int thread) throws InterruptedException + { + Error error; + + /* 1 */ + synchronized (this) + { + /* 2 */ + while (initializing_thread != 0 && initializing_thread != thread) + wait(); + + /* 3 */ + if (initializing_thread == thread) + return; + + /* 4 */ + if (isInitialized()) + return; + + /* 5 */ + if (erroneous_state) + throw new NoClassDefFoundError(); + + /* 6 */ + initializing_thread = thread; + } + + /* 7 */ + try { + step7(); + } + catch(Error e) { + synchronized(this) { + erroneous_state = true; + initializing_thread = 0; + notifyAll(); + throw e; + } + } + + /* 8 */ + try { + step8(); + + /* 9 */ + synchronized(this) { + setInitialized(); + initializing_thread = 0; + notifyAll(); + return; + } + } + + /* 10 */ + catch(Exception e) { + try { + error = new ExceptionInInitializerError(e); + } catch (OutOfMemoryError e2) { + error = e2; + } + } catch(Error e) { + error = e; + } + + /* 11 */ + synchronized(this) { + erroneous_state = true; + initializing_thread = 0; + notifyAll(); + throw error; + } + } + + /** + * Discover whether an Object is an instance of this Class. Think of it + * as almost like <code>o instanceof (this class)</code>. + * + * @param o the Object to check + * @return whether o is an instance of this class + * @since 1.1 + */ + native boolean isInstance(Object o); + + /** + * Discover whether an instance of the Class parameter would be an + * instance of this Class as well. Think of doing + * <code>isInstance(c.newInstance())</code> or even + * <code>c.newInstance() instanceof (this class)</code>. While this + * checks widening conversions for objects, it must be exact for primitive + * types. + * + * @param c the class to check + * @return whether an instance of c would be an instance of this class + * as well + * @throws NullPointerException if c is null + * @since 1.1 + */ + native boolean isAssignableFrom(Class c); + + /** + * Check whether this class is an interface or not. Array types are not + * interfaces. + * + * @return whether this class is an interface or not + */ + native boolean isInterface(); + + /** + * Return whether this class is a primitive type. A primitive type class + * is a class representing a kind of "placeholder" for the various + * primitive types, or void. You can access the various primitive type + * classes through java.lang.Boolean.TYPE, java.lang.Integer.TYPE, etc., + * or through boolean.class, int.class, etc. + * + * @return whether this class is a primitive type + * @see Boolean#TYPE + * @see Byte#TYPE + * @see Character#TYPE + * @see Short#TYPE + * @see Integer#TYPE + * @see Long#TYPE + * @see Float#TYPE + * @see Double#TYPE + * @see Void#TYPE + * @since 1.1 + */ + native boolean isPrimitive(); + + /** + * Get the name of this class, separated by dots for package separators. + * Primitive types and arrays are encoded as: + * <pre> + * boolean Z + * byte B + * char C + * short S + * int I + * long J + * float F + * double D + * void V + * array type [<em>element type</em> + * class or interface, alone: <dotted name> + * class or interface, as element type: L<dotted name>; + * + * @return the name of this class + */ + native String getName(); + + /** + * Get the direct superclass of this class. If this is an interface, + * Object, a primitive type, or void, it will return null. If this is an + * array type, it will return Object. + * + * @return the direct superclass of this class + */ + native Class getSuperclass(); + + /** + * Get the interfaces this class <EM>directly</EM> implements, in the + * order that they were declared. This returns an empty array, not null, + * for Object, primitives, void, and classes or interfaces with no direct + * superinterface. Array types return Cloneable and Serializable. + * + * @return the interfaces this class directly implements + */ + native Class[] getInterfaces(); + + /** + * If this is an array, get the Class representing the type of array. + * Examples: "[[Ljava.lang.String;" would return "[Ljava.lang.String;", and + * calling getComponentType on that would give "java.lang.String". If + * this is not an array, returns null. + * + * @return the array type of this class, or null + * @see Array + * @since 1.1 + */ + native Class getComponentType(); + + /** + * Get the modifiers of this class. These can be decoded using Modifier, + * and is limited to one of public, protected, or private, and any of + * final, static, abstract, or interface. An array class has the same + * public, protected, or private modifier as its component type, and is + * marked final but not an interface. Primitive types and void are marked + * public and final, but not an interface. + * + * @return the modifiers of this class + * @see Modifer + * @since 1.1 + */ + native int getModifiers(); + + /** + * If this is a nested or inner class, return the class that declared it. + * If not, return null. + * + * @return the declaring class of this class + * @since 1.1 + */ + native Class getDeclaringClass(); + + /** + * Like <code>getDeclaredClasses()</code> but without the security checks. + * + * @param pulicOnly Only public classes should be returned + */ + native Class[] getDeclaredClasses(boolean publicOnly); + + /** + * Like <code>getDeclaredFields()</code> but without the security checks. + * + * @param pulicOnly Only public fields should be returned + */ + native Field[] getDeclaredFields(boolean publicOnly); + + /** + * Like <code>getDeclaredMethods()</code> but without the security checks. + * + * @param pulicOnly Only public methods should be returned + */ + native Method[] getDeclaredMethods(boolean publicOnly); + + /** + * Like <code>getDeclaredConstructors()</code> but without + * the security checks. + * + * @param pulicOnly Only public constructors should be returned + */ + native Constructor[] getDeclaredConstructors(boolean publicOnly); + + /** + * Return the class loader of this class. + * + * @return the class loader + */ + native ClassLoader getClassLoader(); + + /** + * VM implementors are free to make this method a noop if + * the default implementation is acceptable. + * + * @param name the name of the class to find + * @return the Class object representing the class or null for noop + * @throws ClassNotFoundException if the class was not found by the + * classloader + * @throws LinkageError if linking the class fails + * @throws ExceptionInInitializerError if the class loads, but an exception + * occurs during initialization + */ + static native Class forName(String name) throws ClassNotFoundException; + + /** + * Return whether this class is an array type. + * + * @return 1 if this class is an array type, 0 otherwise, -1 if unsupported + * operation + */ + native int isArray(); + +} // class VMClass |