emul/src/main/java/java/lang/Class.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 29 Sep 2012 10:47:42 +0200
branchemul
changeset 65 f99a92839285
parent 56 d7a291b7808d
child 80 5856cc62bfa7
permissions -rw-r--r--
Commenting out methods that should not be implemented in JavaScript version
jaroslav@56
     1
/*
jaroslav@56
     2
 * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
jaroslav@56
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jaroslav@56
     4
 *
jaroslav@56
     5
 * This code is free software; you can redistribute it and/or modify it
jaroslav@56
     6
 * under the terms of the GNU General Public License version 2 only, as
jaroslav@56
     7
 * published by the Free Software Foundation.  Oracle designates this
jaroslav@56
     8
 * particular file as subject to the "Classpath" exception as provided
jaroslav@56
     9
 * by Oracle in the LICENSE file that accompanied this code.
jaroslav@56
    10
 *
jaroslav@56
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
jaroslav@56
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jaroslav@56
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
jaroslav@56
    14
 * version 2 for more details (a copy is included in the LICENSE file that
jaroslav@56
    15
 * accompanied this code).
jaroslav@56
    16
 *
jaroslav@56
    17
 * You should have received a copy of the GNU General Public License version
jaroslav@56
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
jaroslav@56
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jaroslav@56
    20
 *
jaroslav@56
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
jaroslav@56
    22
 * or visit www.oracle.com if you need additional information or have any
jaroslav@56
    23
 * questions.
jaroslav@56
    24
 */
jaroslav@56
    25
jaroslav@56
    26
package java.lang;
jaroslav@56
    27
jaroslav@56
    28
import java.lang.annotation.Annotation;
jaroslav@56
    29
jaroslav@56
    30
/**
jaroslav@56
    31
 * Instances of the class {@code Class} represent classes and
jaroslav@56
    32
 * interfaces in a running Java application.  An enum is a kind of
jaroslav@56
    33
 * class and an annotation is a kind of interface.  Every array also
jaroslav@56
    34
 * belongs to a class that is reflected as a {@code Class} object
jaroslav@56
    35
 * that is shared by all arrays with the same element type and number
jaroslav@56
    36
 * of dimensions.  The primitive Java types ({@code boolean},
jaroslav@56
    37
 * {@code byte}, {@code char}, {@code short},
jaroslav@56
    38
 * {@code int}, {@code long}, {@code float}, and
jaroslav@56
    39
 * {@code double}), and the keyword {@code void} are also
jaroslav@56
    40
 * represented as {@code Class} objects.
jaroslav@56
    41
 *
jaroslav@56
    42
 * <p> {@code Class} has no public constructor. Instead {@code Class}
jaroslav@56
    43
 * objects are constructed automatically by the Java Virtual Machine as classes
jaroslav@56
    44
 * are loaded and by calls to the {@code defineClass} method in the class
jaroslav@56
    45
 * loader.
jaroslav@56
    46
 *
jaroslav@56
    47
 * <p> The following example uses a {@code Class} object to print the
jaroslav@56
    48
 * class name of an object:
jaroslav@56
    49
 *
jaroslav@56
    50
 * <p> <blockquote><pre>
jaroslav@56
    51
 *     void printClassName(Object obj) {
jaroslav@56
    52
 *         System.out.println("The class of " + obj +
jaroslav@56
    53
 *                            " is " + obj.getClass().getName());
jaroslav@56
    54
 *     }
jaroslav@56
    55
 * </pre></blockquote>
jaroslav@56
    56
 *
jaroslav@56
    57
 * <p> It is also possible to get the {@code Class} object for a named
jaroslav@56
    58
 * type (or for void) using a class literal.  See Section 15.8.2 of
jaroslav@56
    59
 * <cite>The Java&trade; Language Specification</cite>.
jaroslav@56
    60
 * For example:
jaroslav@56
    61
 *
jaroslav@56
    62
 * <p> <blockquote>
jaroslav@56
    63
 *     {@code System.out.println("The name of class Foo is: "+Foo.class.getName());}
jaroslav@56
    64
 * </blockquote>
jaroslav@56
    65
 *
jaroslav@56
    66
 * @param <T> the type of the class modeled by this {@code Class}
jaroslav@56
    67
 * object.  For example, the type of {@code String.class} is {@code
jaroslav@56
    68
 * Class<String>}.  Use {@code Class<?>} if the class being modeled is
jaroslav@56
    69
 * unknown.
jaroslav@56
    70
 *
jaroslav@56
    71
 * @author  unascribed
jaroslav@56
    72
 * @see     java.lang.ClassLoader#defineClass(byte[], int, int)
jaroslav@56
    73
 * @since   JDK1.0
jaroslav@56
    74
 */
jaroslav@56
    75
public final
jaroslav@65
    76
    class Class<T> implements java.io.Serializable {
jaroslav@65
    77
//                              java.lang.reflect.GenericDeclaration,
jaroslav@65
    78
//                              java.lang.reflect.Type,
jaroslav@65
    79
//                              java.lang.reflect.AnnotatedElement {
jaroslav@56
    80
    private static final int ANNOTATION= 0x00002000;
jaroslav@56
    81
    private static final int ENUM      = 0x00004000;
jaroslav@56
    82
    private static final int SYNTHETIC = 0x00001000;
jaroslav@56
    83
jaroslav@56
    84
    /*
jaroslav@56
    85
     * Constructor. Only the Java Virtual Machine creates Class
jaroslav@56
    86
     * objects.
jaroslav@56
    87
     */
jaroslav@56
    88
    private Class() {}
jaroslav@56
    89
jaroslav@56
    90
jaroslav@56
    91
    /**
jaroslav@56
    92
     * Converts the object to a string. The string representation is the
jaroslav@56
    93
     * string "class" or "interface", followed by a space, and then by the
jaroslav@56
    94
     * fully qualified name of the class in the format returned by
jaroslav@56
    95
     * {@code getName}.  If this {@code Class} object represents a
jaroslav@56
    96
     * primitive type, this method returns the name of the primitive type.  If
jaroslav@56
    97
     * this {@code Class} object represents void this method returns
jaroslav@56
    98
     * "void".
jaroslav@56
    99
     *
jaroslav@56
   100
     * @return a string representation of this class object.
jaroslav@56
   101
     */
jaroslav@56
   102
    public String toString() {
jaroslav@56
   103
        return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
jaroslav@56
   104
            + getName();
jaroslav@56
   105
    }
jaroslav@56
   106
jaroslav@56
   107
jaroslav@56
   108
    /**
jaroslav@56
   109
     * Returns the {@code Class} object associated with the class or
jaroslav@56
   110
     * interface with the given string name.  Invoking this method is
jaroslav@56
   111
     * equivalent to:
jaroslav@56
   112
     *
jaroslav@56
   113
     * <blockquote>
jaroslav@56
   114
     *  {@code Class.forName(className, true, currentLoader)}
jaroslav@56
   115
     * </blockquote>
jaroslav@56
   116
     *
jaroslav@56
   117
     * where {@code currentLoader} denotes the defining class loader of
jaroslav@56
   118
     * the current class.
jaroslav@56
   119
     *
jaroslav@56
   120
     * <p> For example, the following code fragment returns the
jaroslav@56
   121
     * runtime {@code Class} descriptor for the class named
jaroslav@56
   122
     * {@code java.lang.Thread}:
jaroslav@56
   123
     *
jaroslav@56
   124
     * <blockquote>
jaroslav@56
   125
     *   {@code Class t = Class.forName("java.lang.Thread")}
jaroslav@56
   126
     * </blockquote>
jaroslav@56
   127
     * <p>
jaroslav@56
   128
     * A call to {@code forName("X")} causes the class named
jaroslav@56
   129
     * {@code X} to be initialized.
jaroslav@56
   130
     *
jaroslav@56
   131
     * @param      className   the fully qualified name of the desired class.
jaroslav@56
   132
     * @return     the {@code Class} object for the class with the
jaroslav@56
   133
     *             specified name.
jaroslav@56
   134
     * @exception LinkageError if the linkage fails
jaroslav@56
   135
     * @exception ExceptionInInitializerError if the initialization provoked
jaroslav@56
   136
     *            by this method fails
jaroslav@56
   137
     * @exception ClassNotFoundException if the class cannot be located
jaroslav@56
   138
     */
jaroslav@56
   139
    public static Class<?> forName(String className)
jaroslav@56
   140
                throws ClassNotFoundException {
jaroslav@65
   141
        throw new UnsupportedOperationException();
jaroslav@56
   142
    }
jaroslav@56
   143
jaroslav@56
   144
jaroslav@56
   145
    /**
jaroslav@56
   146
     * Creates a new instance of the class represented by this {@code Class}
jaroslav@56
   147
     * object.  The class is instantiated as if by a {@code new}
jaroslav@56
   148
     * expression with an empty argument list.  The class is initialized if it
jaroslav@56
   149
     * has not already been initialized.
jaroslav@56
   150
     *
jaroslav@56
   151
     * <p>Note that this method propagates any exception thrown by the
jaroslav@56
   152
     * nullary constructor, including a checked exception.  Use of
jaroslav@56
   153
     * this method effectively bypasses the compile-time exception
jaroslav@56
   154
     * checking that would otherwise be performed by the compiler.
jaroslav@56
   155
     * The {@link
jaroslav@56
   156
     * java.lang.reflect.Constructor#newInstance(java.lang.Object...)
jaroslav@56
   157
     * Constructor.newInstance} method avoids this problem by wrapping
jaroslav@56
   158
     * any exception thrown by the constructor in a (checked) {@link
jaroslav@56
   159
     * java.lang.reflect.InvocationTargetException}.
jaroslav@56
   160
     *
jaroslav@56
   161
     * @return     a newly allocated instance of the class represented by this
jaroslav@56
   162
     *             object.
jaroslav@56
   163
     * @exception  IllegalAccessException  if the class or its nullary
jaroslav@56
   164
     *               constructor is not accessible.
jaroslav@56
   165
     * @exception  InstantiationException
jaroslav@56
   166
     *               if this {@code Class} represents an abstract class,
jaroslav@56
   167
     *               an interface, an array class, a primitive type, or void;
jaroslav@56
   168
     *               or if the class has no nullary constructor;
jaroslav@56
   169
     *               or if the instantiation fails for some other reason.
jaroslav@56
   170
     * @exception  ExceptionInInitializerError if the initialization
jaroslav@56
   171
     *               provoked by this method fails.
jaroslav@56
   172
     * @exception  SecurityException
jaroslav@56
   173
     *             If a security manager, <i>s</i>, is present and any of the
jaroslav@56
   174
     *             following conditions is met:
jaroslav@56
   175
     *
jaroslav@56
   176
     *             <ul>
jaroslav@56
   177
     *
jaroslav@56
   178
     *             <li> invocation of
jaroslav@56
   179
     *             {@link SecurityManager#checkMemberAccess
jaroslav@56
   180
     *             s.checkMemberAccess(this, Member.PUBLIC)} denies
jaroslav@56
   181
     *             creation of new instances of this class
jaroslav@56
   182
     *
jaroslav@56
   183
     *             <li> the caller's class loader is not the same as or an
jaroslav@56
   184
     *             ancestor of the class loader for the current class and
jaroslav@56
   185
     *             invocation of {@link SecurityManager#checkPackageAccess
jaroslav@56
   186
     *             s.checkPackageAccess()} denies access to the package
jaroslav@56
   187
     *             of this class
jaroslav@56
   188
     *
jaroslav@56
   189
     *             </ul>
jaroslav@56
   190
     *
jaroslav@56
   191
     */
jaroslav@56
   192
    public T newInstance()
jaroslav@56
   193
        throws InstantiationException, IllegalAccessException
jaroslav@56
   194
    {
jaroslav@65
   195
        throw new UnsupportedOperationException("Should be somehow supported");
jaroslav@56
   196
    }
jaroslav@56
   197
jaroslav@56
   198
    /**
jaroslav@56
   199
     * Determines if the specified {@code Object} is assignment-compatible
jaroslav@56
   200
     * with the object represented by this {@code Class}.  This method is
jaroslav@56
   201
     * the dynamic equivalent of the Java language {@code instanceof}
jaroslav@56
   202
     * operator. The method returns {@code true} if the specified
jaroslav@56
   203
     * {@code Object} argument is non-null and can be cast to the
jaroslav@56
   204
     * reference type represented by this {@code Class} object without
jaroslav@56
   205
     * raising a {@code ClassCastException.} It returns {@code false}
jaroslav@56
   206
     * otherwise.
jaroslav@56
   207
     *
jaroslav@56
   208
     * <p> Specifically, if this {@code Class} object represents a
jaroslav@56
   209
     * declared class, this method returns {@code true} if the specified
jaroslav@56
   210
     * {@code Object} argument is an instance of the represented class (or
jaroslav@56
   211
     * of any of its subclasses); it returns {@code false} otherwise. If
jaroslav@56
   212
     * this {@code Class} object represents an array class, this method
jaroslav@56
   213
     * returns {@code true} if the specified {@code Object} argument
jaroslav@56
   214
     * can be converted to an object of the array class by an identity
jaroslav@56
   215
     * conversion or by a widening reference conversion; it returns
jaroslav@56
   216
     * {@code false} otherwise. If this {@code Class} object
jaroslav@56
   217
     * represents an interface, this method returns {@code true} if the
jaroslav@56
   218
     * class or any superclass of the specified {@code Object} argument
jaroslav@56
   219
     * implements this interface; it returns {@code false} otherwise. If
jaroslav@56
   220
     * this {@code Class} object represents a primitive type, this method
jaroslav@56
   221
     * returns {@code false}.
jaroslav@56
   222
     *
jaroslav@56
   223
     * @param   obj the object to check
jaroslav@56
   224
     * @return  true if {@code obj} is an instance of this class
jaroslav@56
   225
     *
jaroslav@56
   226
     * @since JDK1.1
jaroslav@56
   227
     */
jaroslav@56
   228
    public native boolean isInstance(Object obj);
jaroslav@56
   229
jaroslav@56
   230
jaroslav@56
   231
    /**
jaroslav@56
   232
     * Determines if the class or interface represented by this
jaroslav@56
   233
     * {@code Class} object is either the same as, or is a superclass or
jaroslav@56
   234
     * superinterface of, the class or interface represented by the specified
jaroslav@56
   235
     * {@code Class} parameter. It returns {@code true} if so;
jaroslav@56
   236
     * otherwise it returns {@code false}. If this {@code Class}
jaroslav@56
   237
     * object represents a primitive type, this method returns
jaroslav@56
   238
     * {@code true} if the specified {@code Class} parameter is
jaroslav@56
   239
     * exactly this {@code Class} object; otherwise it returns
jaroslav@56
   240
     * {@code false}.
jaroslav@56
   241
     *
jaroslav@56
   242
     * <p> Specifically, this method tests whether the type represented by the
jaroslav@56
   243
     * specified {@code Class} parameter can be converted to the type
jaroslav@56
   244
     * represented by this {@code Class} object via an identity conversion
jaroslav@56
   245
     * or via a widening reference conversion. See <em>The Java Language
jaroslav@56
   246
     * Specification</em>, sections 5.1.1 and 5.1.4 , for details.
jaroslav@56
   247
     *
jaroslav@56
   248
     * @param cls the {@code Class} object to be checked
jaroslav@56
   249
     * @return the {@code boolean} value indicating whether objects of the
jaroslav@56
   250
     * type {@code cls} can be assigned to objects of this class
jaroslav@56
   251
     * @exception NullPointerException if the specified Class parameter is
jaroslav@56
   252
     *            null.
jaroslav@56
   253
     * @since JDK1.1
jaroslav@56
   254
     */
jaroslav@56
   255
    public native boolean isAssignableFrom(Class<?> cls);
jaroslav@56
   256
jaroslav@56
   257
jaroslav@56
   258
    /**
jaroslav@56
   259
     * Determines if the specified {@code Class} object represents an
jaroslav@56
   260
     * interface type.
jaroslav@56
   261
     *
jaroslav@56
   262
     * @return  {@code true} if this object represents an interface;
jaroslav@56
   263
     *          {@code false} otherwise.
jaroslav@56
   264
     */
jaroslav@56
   265
    public native boolean isInterface();
jaroslav@56
   266
jaroslav@56
   267
jaroslav@56
   268
    /**
jaroslav@56
   269
     * Determines if this {@code Class} object represents an array class.
jaroslav@56
   270
     *
jaroslav@56
   271
     * @return  {@code true} if this object represents an array class;
jaroslav@56
   272
     *          {@code false} otherwise.
jaroslav@56
   273
     * @since   JDK1.1
jaroslav@56
   274
     */
jaroslav@56
   275
    public native boolean isArray();
jaroslav@56
   276
jaroslav@56
   277
jaroslav@56
   278
    /**
jaroslav@56
   279
     * Determines if the specified {@code Class} object represents a
jaroslav@56
   280
     * primitive type.
jaroslav@56
   281
     *
jaroslav@56
   282
     * <p> There are nine predefined {@code Class} objects to represent
jaroslav@56
   283
     * the eight primitive types and void.  These are created by the Java
jaroslav@56
   284
     * Virtual Machine, and have the same names as the primitive types that
jaroslav@56
   285
     * they represent, namely {@code boolean}, {@code byte},
jaroslav@56
   286
     * {@code char}, {@code short}, {@code int},
jaroslav@56
   287
     * {@code long}, {@code float}, and {@code double}.
jaroslav@56
   288
     *
jaroslav@56
   289
     * <p> These objects may only be accessed via the following public static
jaroslav@56
   290
     * final variables, and are the only {@code Class} objects for which
jaroslav@56
   291
     * this method returns {@code true}.
jaroslav@56
   292
     *
jaroslav@56
   293
     * @return true if and only if this class represents a primitive type
jaroslav@56
   294
     *
jaroslav@56
   295
     * @see     java.lang.Boolean#TYPE
jaroslav@56
   296
     * @see     java.lang.Character#TYPE
jaroslav@56
   297
     * @see     java.lang.Byte#TYPE
jaroslav@56
   298
     * @see     java.lang.Short#TYPE
jaroslav@56
   299
     * @see     java.lang.Integer#TYPE
jaroslav@56
   300
     * @see     java.lang.Long#TYPE
jaroslav@56
   301
     * @see     java.lang.Float#TYPE
jaroslav@56
   302
     * @see     java.lang.Double#TYPE
jaroslav@56
   303
     * @see     java.lang.Void#TYPE
jaroslav@56
   304
     * @since JDK1.1
jaroslav@56
   305
     */
jaroslav@56
   306
    public native boolean isPrimitive();
jaroslav@56
   307
jaroslav@56
   308
    /**
jaroslav@56
   309
     * Returns true if this {@code Class} object represents an annotation
jaroslav@56
   310
     * type.  Note that if this method returns true, {@link #isInterface()}
jaroslav@56
   311
     * would also return true, as all annotation types are also interfaces.
jaroslav@56
   312
     *
jaroslav@56
   313
     * @return {@code true} if this class object represents an annotation
jaroslav@56
   314
     *      type; {@code false} otherwise
jaroslav@56
   315
     * @since 1.5
jaroslav@56
   316
     */
jaroslav@56
   317
    public boolean isAnnotation() {
jaroslav@56
   318
        return (getModifiers() & ANNOTATION) != 0;
jaroslav@56
   319
    }
jaroslav@56
   320
jaroslav@56
   321
    /**
jaroslav@56
   322
     * Returns {@code true} if this class is a synthetic class;
jaroslav@56
   323
     * returns {@code false} otherwise.
jaroslav@56
   324
     * @return {@code true} if and only if this class is a synthetic class as
jaroslav@56
   325
     *         defined by the Java Language Specification.
jaroslav@56
   326
     * @since 1.5
jaroslav@56
   327
     */
jaroslav@56
   328
    public boolean isSynthetic() {
jaroslav@56
   329
        return (getModifiers() & SYNTHETIC) != 0;
jaroslav@56
   330
    }
jaroslav@56
   331
jaroslav@56
   332
    /**
jaroslav@56
   333
     * Returns the  name of the entity (class, interface, array class,
jaroslav@56
   334
     * primitive type, or void) represented by this {@code Class} object,
jaroslav@56
   335
     * as a {@code String}.
jaroslav@56
   336
     *
jaroslav@56
   337
     * <p> If this class object represents a reference type that is not an
jaroslav@56
   338
     * array type then the binary name of the class is returned, as specified
jaroslav@56
   339
     * by
jaroslav@56
   340
     * <cite>The Java&trade; Language Specification</cite>.
jaroslav@56
   341
     *
jaroslav@56
   342
     * <p> If this class object represents a primitive type or void, then the
jaroslav@56
   343
     * name returned is a {@code String} equal to the Java language
jaroslav@56
   344
     * keyword corresponding to the primitive type or void.
jaroslav@56
   345
     *
jaroslav@56
   346
     * <p> If this class object represents a class of arrays, then the internal
jaroslav@56
   347
     * form of the name consists of the name of the element type preceded by
jaroslav@56
   348
     * one or more '{@code [}' characters representing the depth of the array
jaroslav@56
   349
     * nesting.  The encoding of element type names is as follows:
jaroslav@56
   350
     *
jaroslav@56
   351
     * <blockquote><table summary="Element types and encodings">
jaroslav@56
   352
     * <tr><th> Element Type <th> &nbsp;&nbsp;&nbsp; <th> Encoding
jaroslav@56
   353
     * <tr><td> boolean      <td> &nbsp;&nbsp;&nbsp; <td align=center> Z
jaroslav@56
   354
     * <tr><td> byte         <td> &nbsp;&nbsp;&nbsp; <td align=center> B
jaroslav@56
   355
     * <tr><td> char         <td> &nbsp;&nbsp;&nbsp; <td align=center> C
jaroslav@56
   356
     * <tr><td> class or interface
jaroslav@56
   357
     *                       <td> &nbsp;&nbsp;&nbsp; <td align=center> L<i>classname</i>;
jaroslav@56
   358
     * <tr><td> double       <td> &nbsp;&nbsp;&nbsp; <td align=center> D
jaroslav@56
   359
     * <tr><td> float        <td> &nbsp;&nbsp;&nbsp; <td align=center> F
jaroslav@56
   360
     * <tr><td> int          <td> &nbsp;&nbsp;&nbsp; <td align=center> I
jaroslav@56
   361
     * <tr><td> long         <td> &nbsp;&nbsp;&nbsp; <td align=center> J
jaroslav@56
   362
     * <tr><td> short        <td> &nbsp;&nbsp;&nbsp; <td align=center> S
jaroslav@56
   363
     * </table></blockquote>
jaroslav@56
   364
     *
jaroslav@56
   365
     * <p> The class or interface name <i>classname</i> is the binary name of
jaroslav@56
   366
     * the class specified above.
jaroslav@56
   367
     *
jaroslav@56
   368
     * <p> Examples:
jaroslav@56
   369
     * <blockquote><pre>
jaroslav@56
   370
     * String.class.getName()
jaroslav@56
   371
     *     returns "java.lang.String"
jaroslav@56
   372
     * byte.class.getName()
jaroslav@56
   373
     *     returns "byte"
jaroslav@56
   374
     * (new Object[3]).getClass().getName()
jaroslav@56
   375
     *     returns "[Ljava.lang.Object;"
jaroslav@56
   376
     * (new int[3][4][5][6][7][8][9]).getClass().getName()
jaroslav@56
   377
     *     returns "[[[[[[[I"
jaroslav@56
   378
     * </pre></blockquote>
jaroslav@56
   379
     *
jaroslav@56
   380
     * @return  the name of the class or interface
jaroslav@56
   381
     *          represented by this object.
jaroslav@56
   382
     */
jaroslav@56
   383
    public String getName() {
jaroslav@65
   384
        throw new UnsupportedOperationException();
jaroslav@65
   385
//        String name = this.name;
jaroslav@65
   386
//        if (name == null)
jaroslav@65
   387
//            this.name = name = getName0();
jaroslav@65
   388
//        return name;
jaroslav@56
   389
    }
jaroslav@56
   390
jaroslav@56
   391
    /**
jaroslav@56
   392
     * Returns the {@code Class} representing the superclass of the entity
jaroslav@56
   393
     * (class, interface, primitive type or void) represented by this
jaroslav@56
   394
     * {@code Class}.  If this {@code Class} represents either the
jaroslav@56
   395
     * {@code Object} class, an interface, a primitive type, or void, then
jaroslav@56
   396
     * null is returned.  If this object represents an array class then the
jaroslav@56
   397
     * {@code Class} object representing the {@code Object} class is
jaroslav@56
   398
     * returned.
jaroslav@56
   399
     *
jaroslav@56
   400
     * @return the superclass of the class represented by this object.
jaroslav@56
   401
     */
jaroslav@56
   402
    public native Class<? super T> getSuperclass();
jaroslav@56
   403
jaroslav@56
   404
    /**
jaroslav@56
   405
     * Returns the Java language modifiers for this class or interface, encoded
jaroslav@56
   406
     * in an integer. The modifiers consist of the Java Virtual Machine's
jaroslav@56
   407
     * constants for {@code public}, {@code protected},
jaroslav@56
   408
     * {@code private}, {@code final}, {@code static},
jaroslav@56
   409
     * {@code abstract} and {@code interface}; they should be decoded
jaroslav@56
   410
     * using the methods of class {@code Modifier}.
jaroslav@56
   411
     *
jaroslav@56
   412
     * <p> If the underlying class is an array class, then its
jaroslav@56
   413
     * {@code public}, {@code private} and {@code protected}
jaroslav@56
   414
     * modifiers are the same as those of its component type.  If this
jaroslav@56
   415
     * {@code Class} represents a primitive type or void, its
jaroslav@56
   416
     * {@code public} modifier is always {@code true}, and its
jaroslav@56
   417
     * {@code protected} and {@code private} modifiers are always
jaroslav@56
   418
     * {@code false}. If this object represents an array class, a
jaroslav@56
   419
     * primitive type or void, then its {@code final} modifier is always
jaroslav@56
   420
     * {@code true} and its interface modifier is always
jaroslav@56
   421
     * {@code false}. The values of its other modifiers are not determined
jaroslav@56
   422
     * by this specification.
jaroslav@56
   423
     *
jaroslav@56
   424
     * <p> The modifier encodings are defined in <em>The Java Virtual Machine
jaroslav@56
   425
     * Specification</em>, table 4.1.
jaroslav@56
   426
     *
jaroslav@56
   427
     * @return the {@code int} representing the modifiers for this class
jaroslav@56
   428
     * @see     java.lang.reflect.Modifier
jaroslav@56
   429
     * @since JDK1.1
jaroslav@56
   430
     */
jaroslav@56
   431
    public native int getModifiers();
jaroslav@56
   432
jaroslav@56
   433
jaroslav@56
   434
    /**
jaroslav@56
   435
     * Returns the simple name of the underlying class as given in the
jaroslav@56
   436
     * source code. Returns an empty string if the underlying class is
jaroslav@56
   437
     * anonymous.
jaroslav@56
   438
     *
jaroslav@56
   439
     * <p>The simple name of an array is the simple name of the
jaroslav@56
   440
     * component type with "[]" appended.  In particular the simple
jaroslav@56
   441
     * name of an array whose component type is anonymous is "[]".
jaroslav@56
   442
     *
jaroslav@56
   443
     * @return the simple name of the underlying class
jaroslav@56
   444
     * @since 1.5
jaroslav@56
   445
     */
jaroslav@56
   446
    public String getSimpleName() {
jaroslav@65
   447
        throw new UnsupportedOperationException();
jaroslav@65
   448
////        if (isArray())
jaroslav@65
   449
////            return getComponentType().getSimpleName()+"[]";
jaroslav@65
   450
////
jaroslav@65
   451
////        String simpleName = getSimpleBinaryName();
jaroslav@65
   452
////        if (simpleName == null) { // top level class
jaroslav@65
   453
////            simpleName = getName();
jaroslav@65
   454
////            return simpleName.substring(simpleName.lastIndexOf(".")+1); // strip the package name
jaroslav@65
   455
////        }
jaroslav@65
   456
////        // According to JLS3 "Binary Compatibility" (13.1) the binary
jaroslav@65
   457
////        // name of non-package classes (not top level) is the binary
jaroslav@65
   458
////        // name of the immediately enclosing class followed by a '$' followed by:
jaroslav@65
   459
////        // (for nested and inner classes): the simple name.
jaroslav@65
   460
////        // (for local classes): 1 or more digits followed by the simple name.
jaroslav@65
   461
////        // (for anonymous classes): 1 or more digits.
jaroslav@65
   462
////
jaroslav@65
   463
////        // Since getSimpleBinaryName() will strip the binary name of
jaroslav@65
   464
////        // the immediatly enclosing class, we are now looking at a
jaroslav@65
   465
////        // string that matches the regular expression "\$[0-9]*"
jaroslav@65
   466
////        // followed by a simple name (considering the simple of an
jaroslav@65
   467
////        // anonymous class to be the empty string).
jaroslav@65
   468
////
jaroslav@65
   469
////        // Remove leading "\$[0-9]*" from the name
jaroslav@65
   470
////        int length = simpleName.length();
jaroslav@65
   471
////        if (length < 1 || simpleName.charAt(0) != '$')
jaroslav@65
   472
////            throw new InternalError("Malformed class name");
jaroslav@65
   473
////        int index = 1;
jaroslav@65
   474
////        while (index < length && isAsciiDigit(simpleName.charAt(index)))
jaroslav@65
   475
////            index++;
jaroslav@65
   476
////        // Eventually, this is the empty string iff this is an anonymous class
jaroslav@65
   477
////        return simpleName.substring(index);
jaroslav@56
   478
    }
jaroslav@56
   479
jaroslav@56
   480
    /**
jaroslav@56
   481
     * Character.isDigit answers {@code true} to some non-ascii
jaroslav@56
   482
     * digits.  This one does not.
jaroslav@56
   483
     */
jaroslav@56
   484
    private static boolean isAsciiDigit(char c) {
jaroslav@56
   485
        return '0' <= c && c <= '9';
jaroslav@56
   486
    }
jaroslav@56
   487
jaroslav@56
   488
    /**
jaroslav@56
   489
     * Returns the canonical name of the underlying class as
jaroslav@56
   490
     * defined by the Java Language Specification.  Returns null if
jaroslav@56
   491
     * the underlying class does not have a canonical name (i.e., if
jaroslav@56
   492
     * it is a local or anonymous class or an array whose component
jaroslav@56
   493
     * type does not have a canonical name).
jaroslav@56
   494
     * @return the canonical name of the underlying class if it exists, and
jaroslav@56
   495
     * {@code null} otherwise.
jaroslav@56
   496
     * @since 1.5
jaroslav@56
   497
     */
jaroslav@56
   498
    public String getCanonicalName() {
jaroslav@65
   499
        throw new UnsupportedOperationException();
jaroslav@65
   500
//        if (isArray()) {
jaroslav@65
   501
//            String canonicalName = getComponentType().getCanonicalName();
jaroslav@65
   502
//            if (canonicalName != null)
jaroslav@65
   503
//                return canonicalName + "[]";
jaroslav@65
   504
//            else
jaroslav@65
   505
//                return null;
jaroslav@65
   506
//        }
jaroslav@65
   507
//        if (isLocalOrAnonymousClass())
jaroslav@65
   508
//            return null;
jaroslav@65
   509
//        Class<?> enclosingClass = getEnclosingClass();
jaroslav@65
   510
//        if (enclosingClass == null) { // top level class
jaroslav@65
   511
//            return getName();
jaroslav@65
   512
//        } else {
jaroslav@65
   513
//            String enclosingName = enclosingClass.getCanonicalName();
jaroslav@65
   514
//            if (enclosingName == null)
jaroslav@65
   515
//                return null;
jaroslav@65
   516
//            return enclosingName + "." + getSimpleName();
jaroslav@65
   517
//        }
jaroslav@56
   518
    }
jaroslav@56
   519
jaroslav@56
   520
    /**
jaroslav@56
   521
     * Finds a resource with a given name.  The rules for searching resources
jaroslav@56
   522
     * associated with a given class are implemented by the defining
jaroslav@56
   523
     * {@linkplain ClassLoader class loader} of the class.  This method
jaroslav@56
   524
     * delegates to this object's class loader.  If this object was loaded by
jaroslav@56
   525
     * the bootstrap class loader, the method delegates to {@link
jaroslav@56
   526
     * ClassLoader#getSystemResourceAsStream}.
jaroslav@56
   527
     *
jaroslav@56
   528
     * <p> Before delegation, an absolute resource name is constructed from the
jaroslav@56
   529
     * given resource name using this algorithm:
jaroslav@56
   530
     *
jaroslav@56
   531
     * <ul>
jaroslav@56
   532
     *
jaroslav@56
   533
     * <li> If the {@code name} begins with a {@code '/'}
jaroslav@56
   534
     * (<tt>'&#92;u002f'</tt>), then the absolute name of the resource is the
jaroslav@56
   535
     * portion of the {@code name} following the {@code '/'}.
jaroslav@56
   536
     *
jaroslav@56
   537
     * <li> Otherwise, the absolute name is of the following form:
jaroslav@56
   538
     *
jaroslav@56
   539
     * <blockquote>
jaroslav@56
   540
     *   {@code modified_package_name/name}
jaroslav@56
   541
     * </blockquote>
jaroslav@56
   542
     *
jaroslav@56
   543
     * <p> Where the {@code modified_package_name} is the package name of this
jaroslav@56
   544
     * object with {@code '/'} substituted for {@code '.'}
jaroslav@56
   545
     * (<tt>'&#92;u002e'</tt>).
jaroslav@56
   546
     *
jaroslav@56
   547
     * </ul>
jaroslav@56
   548
     *
jaroslav@56
   549
     * @param  name name of the desired resource
jaroslav@56
   550
     * @return      A {@link java.io.InputStream} object or {@code null} if
jaroslav@56
   551
     *              no resource with this name is found
jaroslav@56
   552
     * @throws  NullPointerException If {@code name} is {@code null}
jaroslav@56
   553
     * @since  JDK1.1
jaroslav@56
   554
     */
jaroslav@65
   555
//     public InputStream getResourceAsStream(String name) {
jaroslav@65
   556
//        name = resolveName(name);
jaroslav@65
   557
//        ClassLoader cl = getClassLoader0();
jaroslav@65
   558
//        if (cl==null) {
jaroslav@65
   559
//            // A system class.
jaroslav@65
   560
//            return ClassLoader.getSystemResourceAsStream(name);
jaroslav@65
   561
//        }
jaroslav@65
   562
//        return cl.getResourceAsStream(name);
jaroslav@65
   563
//    }
jaroslav@56
   564
jaroslav@56
   565
    /**
jaroslav@56
   566
     * Finds a resource with a given name.  The rules for searching resources
jaroslav@56
   567
     * associated with a given class are implemented by the defining
jaroslav@56
   568
     * {@linkplain ClassLoader class loader} of the class.  This method
jaroslav@56
   569
     * delegates to this object's class loader.  If this object was loaded by
jaroslav@56
   570
     * the bootstrap class loader, the method delegates to {@link
jaroslav@56
   571
     * ClassLoader#getSystemResource}.
jaroslav@56
   572
     *
jaroslav@56
   573
     * <p> Before delegation, an absolute resource name is constructed from the
jaroslav@56
   574
     * given resource name using this algorithm:
jaroslav@56
   575
     *
jaroslav@56
   576
     * <ul>
jaroslav@56
   577
     *
jaroslav@56
   578
     * <li> If the {@code name} begins with a {@code '/'}
jaroslav@56
   579
     * (<tt>'&#92;u002f'</tt>), then the absolute name of the resource is the
jaroslav@56
   580
     * portion of the {@code name} following the {@code '/'}.
jaroslav@56
   581
     *
jaroslav@56
   582
     * <li> Otherwise, the absolute name is of the following form:
jaroslav@56
   583
     *
jaroslav@56
   584
     * <blockquote>
jaroslav@56
   585
     *   {@code modified_package_name/name}
jaroslav@56
   586
     * </blockquote>
jaroslav@56
   587
     *
jaroslav@56
   588
     * <p> Where the {@code modified_package_name} is the package name of this
jaroslav@56
   589
     * object with {@code '/'} substituted for {@code '.'}
jaroslav@56
   590
     * (<tt>'&#92;u002e'</tt>).
jaroslav@56
   591
     *
jaroslav@56
   592
     * </ul>
jaroslav@56
   593
     *
jaroslav@56
   594
     * @param  name name of the desired resource
jaroslav@56
   595
     * @return      A  {@link java.net.URL} object or {@code null} if no
jaroslav@56
   596
     *              resource with this name is found
jaroslav@56
   597
     * @since  JDK1.1
jaroslav@56
   598
     */
jaroslav@65
   599
//    public java.net.URL getResource(String name) {
jaroslav@65
   600
//        name = resolveName(name);
jaroslav@65
   601
//        ClassLoader cl = getClassLoader0();
jaroslav@65
   602
//        if (cl==null) {
jaroslav@65
   603
//            // A system class.
jaroslav@65
   604
//            return ClassLoader.getSystemResource(name);
jaroslav@65
   605
//        }
jaroslav@65
   606
//        return cl.getResource(name);
jaroslav@65
   607
//    }
jaroslav@56
   608
jaroslav@56
   609
jaroslav@56
   610
jaroslav@56
   611
jaroslav@56
   612
    /**
jaroslav@56
   613
     * Returns true if and only if this class was declared as an enum in the
jaroslav@56
   614
     * source code.
jaroslav@56
   615
     *
jaroslav@56
   616
     * @return true if and only if this class was declared as an enum in the
jaroslav@56
   617
     *     source code
jaroslav@56
   618
     * @since 1.5
jaroslav@56
   619
     */
jaroslav@56
   620
    public boolean isEnum() {
jaroslav@56
   621
        // An enum must both directly extend java.lang.Enum and have
jaroslav@56
   622
        // the ENUM bit set; classes for specialized enum constants
jaroslav@56
   623
        // don't do the former.
jaroslav@56
   624
        return (this.getModifiers() & ENUM) != 0 &&
jaroslav@56
   625
        this.getSuperclass() == java.lang.Enum.class;
jaroslav@56
   626
    }
jaroslav@56
   627
jaroslav@56
   628
    /**
jaroslav@56
   629
     * Casts an object to the class or interface represented
jaroslav@56
   630
     * by this {@code Class} object.
jaroslav@56
   631
     *
jaroslav@56
   632
     * @param obj the object to be cast
jaroslav@56
   633
     * @return the object after casting, or null if obj is null
jaroslav@56
   634
     *
jaroslav@56
   635
     * @throws ClassCastException if the object is not
jaroslav@56
   636
     * null and is not assignable to the type T.
jaroslav@56
   637
     *
jaroslav@56
   638
     * @since 1.5
jaroslav@56
   639
     */
jaroslav@56
   640
    public T cast(Object obj) {
jaroslav@56
   641
        if (obj != null && !isInstance(obj))
jaroslav@56
   642
            throw new ClassCastException(cannotCastMsg(obj));
jaroslav@56
   643
        return (T) obj;
jaroslav@56
   644
    }
jaroslav@56
   645
jaroslav@56
   646
    private String cannotCastMsg(Object obj) {
jaroslav@56
   647
        return "Cannot cast " + obj.getClass().getName() + " to " + getName();
jaroslav@56
   648
    }
jaroslav@56
   649
jaroslav@56
   650
    /**
jaroslav@56
   651
     * Casts this {@code Class} object to represent a subclass of the class
jaroslav@56
   652
     * represented by the specified class object.  Checks that that the cast
jaroslav@56
   653
     * is valid, and throws a {@code ClassCastException} if it is not.  If
jaroslav@56
   654
     * this method succeeds, it always returns a reference to this class object.
jaroslav@56
   655
     *
jaroslav@56
   656
     * <p>This method is useful when a client needs to "narrow" the type of
jaroslav@56
   657
     * a {@code Class} object to pass it to an API that restricts the
jaroslav@56
   658
     * {@code Class} objects that it is willing to accept.  A cast would
jaroslav@56
   659
     * generate a compile-time warning, as the correctness of the cast
jaroslav@56
   660
     * could not be checked at runtime (because generic types are implemented
jaroslav@56
   661
     * by erasure).
jaroslav@56
   662
     *
jaroslav@56
   663
     * @return this {@code Class} object, cast to represent a subclass of
jaroslav@56
   664
     *    the specified class object.
jaroslav@56
   665
     * @throws ClassCastException if this {@code Class} object does not
jaroslav@56
   666
     *    represent a subclass of the specified class (here "subclass" includes
jaroslav@56
   667
     *    the class itself).
jaroslav@56
   668
     * @since 1.5
jaroslav@56
   669
     */
jaroslav@56
   670
    public <U> Class<? extends U> asSubclass(Class<U> clazz) {
jaroslav@56
   671
        if (clazz.isAssignableFrom(this))
jaroslav@56
   672
            return (Class<? extends U>) this;
jaroslav@56
   673
        else
jaroslav@56
   674
            throw new ClassCastException(this.toString());
jaroslav@56
   675
    }
jaroslav@56
   676
jaroslav@56
   677
    /**
jaroslav@56
   678
     * @throws NullPointerException {@inheritDoc}
jaroslav@56
   679
     * @since 1.5
jaroslav@56
   680
     */
jaroslav@56
   681
    public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
jaroslav@65
   682
        throw new UnsupportedOperationException();
jaroslav@56
   683
    }
jaroslav@56
   684
jaroslav@56
   685
    /**
jaroslav@56
   686
     * @throws NullPointerException {@inheritDoc}
jaroslav@56
   687
     * @since 1.5
jaroslav@56
   688
     */
jaroslav@56
   689
    public boolean isAnnotationPresent(
jaroslav@56
   690
        Class<? extends Annotation> annotationClass) {
jaroslav@56
   691
        if (annotationClass == null)
jaroslav@56
   692
            throw new NullPointerException();
jaroslav@56
   693
jaroslav@56
   694
        return getAnnotation(annotationClass) != null;
jaroslav@56
   695
    }
jaroslav@56
   696
jaroslav@56
   697
jaroslav@56
   698
    /**
jaroslav@56
   699
     * @since 1.5
jaroslav@56
   700
     */
jaroslav@56
   701
    public Annotation[] getAnnotations() {
jaroslav@65
   702
        throw new UnsupportedOperationException();
jaroslav@56
   703
    }
jaroslav@56
   704
jaroslav@56
   705
    /**
jaroslav@56
   706
     * @since 1.5
jaroslav@56
   707
     */
jaroslav@56
   708
    public Annotation[] getDeclaredAnnotations()  {
jaroslav@65
   709
        throw new UnsupportedOperationException();
jaroslav@56
   710
    }
jaroslav@56
   711
jaroslav@56
   712
}