mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			239 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Java
		
	
	
	
| // Class.java - Representation of a Java class.
 | |
| 
 | |
| /* Copyright (C) 1998, 1999, 2000  Free Software Foundation
 | |
| 
 | |
|    This file is part of libgcj.
 | |
| 
 | |
| This software is copyrighted work licensed under the terms of the
 | |
| Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
 | |
| details.  */
 | |
| 
 | |
| package java.lang;
 | |
| import java.io.Serializable;
 | |
| import java.io.InputStream;
 | |
| import java.lang.reflect.*;
 | |
| import java.security.*;
 | |
| 
 | |
| /**
 | |
|  * @author Tom Tromey <tromey@cygnus.com>
 | |
|  * @date October 1, 1998 
 | |
|  */
 | |
| 
 | |
| /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
 | |
|  * "The Java Language Specification", ISBN 0-201-63451-1
 | |
|  * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
 | |
|  * plus gcj compiler sources (to determine object layout)
 | |
|  * Status:  Sufficient for our purposes, but some methods missing
 | |
|  * and some not implemented.
 | |
|  */
 | |
| 
 | |
| public final class Class implements Serializable
 | |
| {
 | |
|   public static native Class forName (String className)
 | |
|     throws ClassNotFoundException;
 | |
|   /** @since 1.2 */
 | |
|   public static native Class forName (String className, boolean initialize,
 | |
| 				      ClassLoader loader)
 | |
|     throws ClassNotFoundException;
 | |
|   public native Class[] getClasses ();
 | |
|   public native ClassLoader getClassLoader ();
 | |
|   public native Class getComponentType ();
 | |
| 
 | |
|   public native Constructor getConstructor (Class[] parameterTypes)
 | |
|     throws NoSuchMethodException, SecurityException;
 | |
| 
 | |
|   // This is used to implement getConstructors and
 | |
|   // getDeclaredConstructors.
 | |
|   private native Constructor[] _getConstructors (boolean declared)
 | |
|     throws SecurityException;
 | |
| 
 | |
|   public Constructor[] getConstructors () throws SecurityException
 | |
|   {
 | |
|     return _getConstructors (false);
 | |
|   }
 | |
| 
 | |
|   public native Constructor getDeclaredConstructor (Class[] parameterTypes)
 | |
|     throws NoSuchMethodException, SecurityException;
 | |
| 
 | |
|   public native Class[] getDeclaredClasses () throws SecurityException;
 | |
| 
 | |
|   public Constructor[] getDeclaredConstructors () throws SecurityException
 | |
|   {
 | |
|     return _getConstructors (true);
 | |
|   }
 | |
| 
 | |
|   public native Field getDeclaredField (String fieldName)
 | |
|     throws NoSuchFieldException, SecurityException;
 | |
|   public native Field[] getDeclaredFields () throws SecurityException;
 | |
|   public native Method getDeclaredMethod (String methodName,
 | |
| 					  Class[] parameterTypes)
 | |
|     throws NoSuchMethodException, SecurityException;
 | |
|   public native Method[] getDeclaredMethods () throws SecurityException;
 | |
| 
 | |
|   // This is marked as unimplemented in the JCL book.
 | |
|   public native Class getDeclaringClass ();
 | |
| 
 | |
|   private native Field getField (String fieldName, int hash)
 | |
|     throws NoSuchFieldException, SecurityException;
 | |
| 
 | |
|   public Field getField (String fieldName)
 | |
|     throws NoSuchFieldException, SecurityException
 | |
|   {
 | |
|     SecurityManager s = System.getSecurityManager();
 | |
|     if (s != null)
 | |
|       s.checkMemberAccess (this, java.lang.reflect.Member.DECLARED);
 | |
|     Field fld = getField(fieldName, fieldName.hashCode());
 | |
|     if (fld == null)
 | |
|       throw new NoSuchFieldException(fieldName);
 | |
|     return fld;
 | |
|   }
 | |
| 
 | |
|   private native Field[] _getFields (Field[] result, int offset);
 | |
|   public native Field[] getFields () throws SecurityException;
 | |
| 
 | |
|   /**
 | |
|    * 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.
 | |
|    *
 | |
|    * @since 1.2
 | |
|    */
 | |
|   public Package getPackage()
 | |
|   {
 | |
|     ClassLoader cl = getClassLoader();
 | |
|     if (cl != null)
 | |
|       {
 | |
|         String name = getName();
 | |
| 	String pkg = "";
 | |
| 	int idx = name.lastIndexOf('.');
 | |
| 	if (idx >= 0)
 | |
| 	  pkg = name.substring(0, idx);
 | |
| 	return cl.getPackage(pkg);
 | |
|       }
 | |
|     else
 | |
|       return null;
 | |
|   }
 | |
| 
 | |
|   public native Class[] getInterfaces ();
 | |
| 
 | |
|   private final native void getSignature (StringBuffer buffer);
 | |
|   private static final native String getSignature (Class[] parameterTypes,
 | |
| 						   boolean is_construtor);
 | |
| 
 | |
|   public native Method getMethod (String methodName, Class[] parameterTypes)
 | |
|     throws NoSuchMethodException, SecurityException;
 | |
|   private native int _getMethods (Method[] result, int offset);
 | |
|   public native Method[] getMethods () throws SecurityException;
 | |
| 
 | |
|   public native int getModifiers ();
 | |
|   public native String getName ();
 | |
| 
 | |
|   public java.net.URL getResource (String resourceName)
 | |
|   {
 | |
|     String name = resourcePath (resourceName);
 | |
|     ClassLoader loader = getClassLoader ();
 | |
|     if (loader == null)
 | |
|       return ClassLoader.getSystemResource (name);
 | |
|     else
 | |
|       return loader.getResource (name);
 | |
|   }
 | |
| 
 | |
|   public java.io.InputStream getResourceAsStream (String resourceName)
 | |
|   {
 | |
|     String name = resourcePath (resourceName);
 | |
|     ClassLoader loader = getClassLoader ();
 | |
|     if (loader == null)
 | |
|       return ClassLoader.getSystemResourceAsStream (name);
 | |
|     else
 | |
|       return loader.getResourceAsStream (name);
 | |
|   }
 | |
| 
 | |
|   private String resourcePath (String resourceName)
 | |
|   {
 | |
|     if (resourceName.startsWith ("/"))
 | |
|       return resourceName.substring (1);
 | |
| 
 | |
|     Class c = this;
 | |
|     while (c.isArray ())
 | |
|       c = c.getComponentType ();
 | |
| 
 | |
|     String packageName = c.getName ().replace ('.', '/');
 | |
|     int end = packageName.lastIndexOf ('/');
 | |
|     if (end == -1)
 | |
|       return resourceName;
 | |
|     else
 | |
|       return packageName.substring (0, end+1) + resourceName;
 | |
|   }
 | |
| 
 | |
|   // FIXME: implement.  Requires java.security.
 | |
|   public Object[] getSigners ()
 | |
|   {
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   public native Class getSuperclass ();
 | |
|   public native boolean isArray ();
 | |
|   public native boolean isAssignableFrom (Class cls);
 | |
|   public native boolean isInstance (Object obj);
 | |
|   public native boolean isInterface ();
 | |
|   public native boolean isPrimitive ();
 | |
|   public native Object newInstance ()
 | |
|     throws InstantiationException, IllegalAccessException;
 | |
| 
 | |
|   // We need a native method to retrieve the protection domain, because we
 | |
|   // can't add fields to java.lang.Class that are accessible from Java.
 | |
|   private native ProtectionDomain getProtectionDomain0();
 | |
| 
 | |
|   /**
 | |
|    * 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.
 | |
|    *
 | |
|    * @exception SecurityException if a security manager exists and the caller
 | |
|    * does not have <code>RuntimePermission("getProtectionDomain")</code>.
 | |
|    *
 | |
|    * @since 1.2
 | |
|    */
 | |
|   public ProtectionDomain getProtectionDomain()
 | |
|   {
 | |
|     SecurityManager sm = System.getSecurityManager();
 | |
|     if (sm != null)
 | |
|       sm.checkPermission(ClassLoader.protectionDomainPermission);
 | |
|     
 | |
|     ProtectionDomain protectionDomain = getProtectionDomain0();
 | |
| 
 | |
|     if (protectionDomain == null)
 | |
|       return ClassLoader.unknownProtectionDomain;
 | |
|     else
 | |
|       return protectionDomain;
 | |
|   }
 | |
| 
 | |
|   public String toString ()
 | |
|   {
 | |
|     if (isPrimitive ())
 | |
|       return getName ();
 | |
|     return (isInterface () ? "interface " : "class ") + getName ();
 | |
|   }
 | |
| 
 | |
|   // Don't allow new classes to be made.
 | |
|   private Class ()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   // Do a security check.
 | |
|   private void checkMemberAccess (int flags)
 | |
|   {
 | |
|     SecurityManager sm = System.getSecurityManager();
 | |
|     if (sm != null)
 | |
|       sm.checkMemberAccess(this, flags);
 | |
|   }
 | |
| 
 | |
|   // Initialize the class.
 | |
|   private native void initializeClass ();
 | |
| 
 | |
|   // finalization
 | |
|   protected native void finalize ();
 | |
| }
 |