2 * Copyright (C) 2008 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include "native/InternalNativePriv.h"
25 * native public boolean desiredAssertionStatus()
27 * Determine the class-init-time assertion status of a class. This is
28 * called from <clinit> in javac-generated classes that use the Java
29 * programming language "assert" keyword.
31 static void Dalvik_java_lang_Class_desiredAssertionStatus(const u4* args,
34 ClassObject* thisPtr = (ClassObject*) args[0];
35 char* className = dvmDescriptorToName(thisPtr->descriptor);
40 * Run through the list of arguments specified on the command line. The
41 * last matching argument takes precedence.
43 for (i = 0; i < gDvm.assertionCtrlCount; i++) {
44 const AssertionControl* pCtrl = &gDvm.assertionCtrl[i];
46 if (pCtrl->isPackage) {
48 * Given "dalvik/system/Debug" or "MyStuff", compute the
49 * length of the package portion of the class name string.
51 * Unlike most package operations, we allow matching on
52 * "sub-packages", so "dalvik..." will match "dalvik.Foo"
53 * and "dalvik.system.Foo".
55 * The pkgOrClass string looks like "dalvik/system/", i.e. it still
56 * has the terminating slash, so we can be sure we're comparing
57 * against full package component names.
59 const char* lastSlash;
62 lastSlash = strrchr(className, '/');
63 if (lastSlash == NULL) {
66 pkgLen = lastSlash - className +1;
69 if (pCtrl->pkgOrClassLen > pkgLen ||
70 memcmp(pCtrl->pkgOrClass, className, pCtrl->pkgOrClassLen) != 0)
72 LOGV("ASRT: pkg no match: '%s'(%d) vs '%s'\n",
73 className, pkgLen, pCtrl->pkgOrClass);
75 LOGV("ASRT: pkg match: '%s'(%d) vs '%s' --> %d\n",
76 className, pkgLen, pCtrl->pkgOrClass, pCtrl->enable);
77 enable = pCtrl->enable;
81 * "pkgOrClass" holds a fully-qualified class name, converted from
82 * dot-form to slash-form. An empty string means all classes.
84 if (pCtrl->pkgOrClass == NULL) {
85 /* -esa/-dsa; see if class is a "system" class */
86 if (strncmp(className, "java/", 5) != 0) {
87 LOGV("ASRT: sys no match: '%s'\n", className);
89 LOGV("ASRT: sys match: '%s' --> %d\n",
90 className, pCtrl->enable);
91 enable = pCtrl->enable;
93 } else if (*pCtrl->pkgOrClass == '\0') {
94 LOGV("ASRT: class all: '%s' --> %d\n",
95 className, pCtrl->enable);
96 enable = pCtrl->enable;
98 if (strcmp(pCtrl->pkgOrClass, className) != 0) {
99 LOGV("ASRT: cls no match: '%s' vs '%s'\n",
100 className, pCtrl->pkgOrClass);
102 LOGV("ASRT: cls match: '%s' vs '%s' --> %d\n",
103 className, pCtrl->pkgOrClass, pCtrl->enable);
104 enable = pCtrl->enable;
115 * static public Class<?> classForName(String name, boolean initialize,
116 * ClassLoader loader)
118 * Return the Class object associated with the class or interface with
119 * the specified name.
121 * "name" is in "binary name" format, e.g. "dalvik.system.Debug$1".
123 static void Dalvik_java_lang_Class_classForName(const u4* args, JValue* pResult)
125 StringObject* nameObj = (StringObject*) args[0];
126 bool initialize = (args[1] != 0);
127 Object* loader = (Object*) args[2];
129 RETURN_PTR(dvmFindClassByName(nameObj, loader, initialize));
133 * static private ClassLoader getClassLoader(Class clazz)
135 * Return the class' defining class loader.
137 static void Dalvik_java_lang_Class_getClassLoader(const u4* args,
140 ClassObject* clazz = (ClassObject*) args[0];
142 RETURN_PTR(clazz->classLoader);
146 * public Class<?> getComponentType()
148 * If this is an array type, return the class of the elements; otherwise
151 static void Dalvik_java_lang_Class_getComponentType(const u4* args,
154 ClassObject* thisPtr = (ClassObject*) args[0];
156 if (!dvmIsArrayClass(thisPtr))
160 * We can't just return thisPtr->elementClass, because that gives
161 * us the base type (e.g. X[][][] returns X). If this is a multi-
162 * dimensional array, we have to do the lookup by name.
164 if (thisPtr->descriptor[1] == '[')
165 RETURN_PTR(dvmFindArrayClass(&thisPtr->descriptor[1],
166 thisPtr->classLoader));
168 RETURN_PTR(thisPtr->elementClass);
172 * private static Class<?>[] getDeclaredClasses(Class<?> clazz,
173 * boolean publicOnly)
175 * Return an array with the classes that are declared by the specified class.
176 * If "publicOnly" is set, we strip out any classes that don't have "public"
179 static void Dalvik_java_lang_Class_getDeclaredClasses(const u4* args,
182 ClassObject* clazz = (ClassObject*) args[0];
183 bool publicOnly = (args[1] != 0);
184 ArrayObject* classes;
186 classes = dvmGetDeclaredClasses(clazz);
187 if (classes == NULL) {
188 if (!dvmCheckException(dvmThreadSelf())) {
189 /* empty list, so create a zero-length array */
190 classes = dvmAllocArrayByClass(gDvm.classJavaLangClassArray,
193 } else if (publicOnly) {
194 u4 count, newIdx, publicCount = 0;
195 ClassObject** pSource = (ClassObject**) classes->contents;
196 u4 length = classes->length;
198 /* count up public classes */
199 for (count = 0; count < length; count++) {
200 if (dvmIsPublicClass(pSource[count]))
204 /* create a new array to hold them */
205 ArrayObject* newClasses;
206 newClasses = dvmAllocArrayByClass(gDvm.classJavaLangClassArray,
207 publicCount, ALLOC_DEFAULT);
210 for (count = newIdx = 0; count < length; count++) {
211 if (dvmIsPublicClass(pSource[count])) {
212 dvmSetObjectArrayElement(newClasses, newIdx,
213 (Object *)pSource[count]);
217 assert(newIdx == publicCount);
218 dvmReleaseTrackedAlloc((Object*) classes, NULL);
219 classes = newClasses;
222 dvmReleaseTrackedAlloc((Object*) classes, NULL);
227 * static Constructor[] getDeclaredConstructors(Class clazz, boolean publicOnly)
228 * throws SecurityException
230 static void Dalvik_java_lang_Class_getDeclaredConstructors(const u4* args,
233 ClassObject* clazz = (ClassObject*) args[0];
234 bool publicOnly = (args[1] != 0);
235 ArrayObject* constructors;
237 constructors = dvmGetDeclaredConstructors(clazz, publicOnly);
238 dvmReleaseTrackedAlloc((Object*) constructors, NULL);
240 RETURN_PTR(constructors);
244 * static Field[] getDeclaredFields(Class klass, boolean publicOnly)
245 * throws SecurityException
247 static void Dalvik_java_lang_Class_getDeclaredFields(const u4* args,
250 ClassObject* clazz = (ClassObject*) args[0];
251 bool publicOnly = (args[1] != 0);
254 fields = dvmGetDeclaredFields(clazz, publicOnly);
255 dvmReleaseTrackedAlloc((Object*) fields, NULL);
261 * static Method[] getDeclaredMethods(Class clazz, boolean publicOnly)
262 * throws SecurityException
264 static void Dalvik_java_lang_Class_getDeclaredMethods(const u4* args,
267 ClassObject* clazz = (ClassObject*) args[0];
268 bool publicOnly = (args[1] != 0);
269 ArrayObject* methods;
271 methods = dvmGetDeclaredMethods(clazz, publicOnly);
272 dvmReleaseTrackedAlloc((Object*) methods, NULL);
278 * static native Member getDeclaredConstructorOrMethod(
279 * Class clazz, String name, Class[] args);
281 static void Dalvik_java_lang_Class_getDeclaredConstructorOrMethod(
282 const u4* args, JValue* pResult)
284 ClassObject* clazz = (ClassObject*) args[0];
285 StringObject* nameObj = (StringObject*) args[1];
286 ArrayObject* methodArgs = (ArrayObject*) args[2];
290 methodObj = dvmGetDeclaredConstructorOrMethod(clazz, nameObj, methodArgs);
291 dvmReleaseTrackedAlloc(methodObj, NULL);
293 RETURN_PTR(methodObj);
297 * Class[] getInterfaces()
299 static void Dalvik_java_lang_Class_getInterfaces(const u4* args,
302 ClassObject* clazz = (ClassObject*) args[0];
303 ArrayObject* interfaces;
305 interfaces = dvmGetInterfaces(clazz);
306 dvmReleaseTrackedAlloc((Object*) interfaces, NULL);
308 RETURN_PTR(interfaces);
312 * private static int getModifiers(Class klass, boolean
313 * ignoreInnerClassesAttrib)
315 * Return the class' modifier flags. If "ignoreInnerClassesAttrib" is false,
316 * and this is an inner class, we return the access flags from the inner class
319 static void Dalvik_java_lang_Class_getModifiers(const u4* args, JValue* pResult)
321 ClassObject* clazz = (ClassObject*) args[0];
322 bool ignoreInner = args[1];
325 accessFlags = clazz->accessFlags & JAVA_FLAGS_MASK;
328 /* see if we have an InnerClass annotation with flags in it */
329 StringObject* className = NULL;
332 if (dvmGetInnerClass(clazz, &className, &innerFlags))
333 accessFlags = innerFlags & JAVA_FLAGS_MASK;
335 dvmReleaseTrackedAlloc((Object*) className, NULL);
338 RETURN_INT(accessFlags);
342 * private native String getNameNative()
344 * Return the class' name. The exact format is bizarre, but it's the specified
345 * behavior: keywords for primitive types, regular "[I" form for primitive
346 * arrays (so "int" but "[I"), and arrays of reference types written
347 * between "L" and ";" but with dots rather than slashes (so "java.lang.String"
348 * but "[Ljava.lang.String;"). Madness.
350 static void Dalvik_java_lang_Class_getNameNative(const u4* args, JValue* pResult)
352 ClassObject* clazz = (ClassObject*) args[0];
353 const char* descriptor = clazz->descriptor;
354 StringObject* nameObj;
356 if ((descriptor[0] != 'L') && (descriptor[0] != '[')) {
358 * The descriptor indicates that this is the class for
359 * a primitive type; special-case the return value.
362 switch (descriptor[0]) {
363 case 'Z': name = "boolean"; break;
364 case 'B': name = "byte"; break;
365 case 'C': name = "char"; break;
366 case 'S': name = "short"; break;
367 case 'I': name = "int"; break;
368 case 'J': name = "long"; break;
369 case 'F': name = "float"; break;
370 case 'D': name = "double"; break;
371 case 'V': name = "void"; break;
373 LOGE("Unknown primitive type '%c'\n", descriptor[0]);
379 nameObj = dvmCreateStringFromCstr(name);
382 * Convert the UTF-8 name to a java.lang.String. The
383 * name must use '.' to separate package components.
385 * TODO: this could be more efficient. Consider a custom
386 * conversion function here that walks the string once and
387 * avoids the allocation for the common case (name less than,
390 char* dotName = dvmDescriptorToDot(clazz->descriptor);
391 nameObj = dvmCreateStringFromCstr(dotName);
395 dvmReleaseTrackedAlloc((Object*) nameObj, NULL);
400 * Return the superclass for instances of this class.
402 * If the class represents a java/lang/Object, an interface, a primitive
403 * type, or void (which *is* a primitive type??), return NULL.
405 * For an array, return the java/lang/Object ClassObject.
407 static void Dalvik_java_lang_Class_getSuperclass(const u4* args,
410 ClassObject* clazz = (ClassObject*) args[0];
412 if (dvmIsPrimitiveClass(clazz) || dvmIsInterfaceClass(clazz))
415 RETURN_PTR(clazz->super);
419 * public boolean isAssignableFrom(Class<?> cls)
421 * Determine if this class is either the same as, or is a superclass or
422 * superinterface of, the class specified in the "cls" parameter.
424 static void Dalvik_java_lang_Class_isAssignableFrom(const u4* args,
427 ClassObject* thisPtr = (ClassObject*) args[0];
428 ClassObject* testClass = (ClassObject*) args[1];
430 if (testClass == NULL) {
431 dvmThrowException("Ljava/lang/NullPointerException;", NULL);
434 RETURN_INT(dvmInstanceof(testClass, thisPtr));
438 * public boolean isInstance(Object o)
440 * Dynamic equivalent of Java programming language "instanceof".
442 static void Dalvik_java_lang_Class_isInstance(const u4* args,
445 ClassObject* thisPtr = (ClassObject*) args[0];
446 Object* testObj = (Object*) args[1];
450 RETURN_INT(dvmInstanceof(testObj->clazz, thisPtr));
454 * public boolean isInterface()
456 static void Dalvik_java_lang_Class_isInterface(const u4* args,
459 ClassObject* thisPtr = (ClassObject*) args[0];
461 RETURN_INT(dvmIsInterfaceClass(thisPtr));
465 * public boolean isPrimitive()
467 static void Dalvik_java_lang_Class_isPrimitive(const u4* args,
470 ClassObject* thisPtr = (ClassObject*) args[0];
472 RETURN_INT(dvmIsPrimitiveClass(thisPtr));
476 * public T newInstance() throws InstantiationException, IllegalAccessException
478 * Create a new instance of this class.
480 static void Dalvik_java_lang_Class_newInstance(const u4* args, JValue* pResult)
482 Thread* self = dvmThreadSelf();
483 ClassObject* clazz = (ClassObject*) args[0];
487 /* can't instantiate these */
488 if (dvmIsPrimitiveClass(clazz) || dvmIsInterfaceClass(clazz)
489 || dvmIsArrayClass(clazz) || dvmIsAbstractClass(clazz))
491 LOGD("newInstance failed: p%d i%d [%d a%d\n",
492 dvmIsPrimitiveClass(clazz), dvmIsInterfaceClass(clazz),
493 dvmIsArrayClass(clazz), dvmIsAbstractClass(clazz));
494 dvmThrowExceptionWithClassMessage("Ljava/lang/InstantiationException;",
499 /* initialize the class if it hasn't been already */
500 if (!dvmIsClassInitialized(clazz)) {
501 if (!dvmInitClass(clazz)) {
502 LOGW("Class init failed in newInstance call (%s)\n",
504 assert(dvmCheckException(self));
509 /* find the "nullary" constructor */
510 init = dvmFindDirectMethodByDescriptor(clazz, "<init>", "()V");
512 /* common cause: secret "this" arg on non-static inner class ctor */
513 LOGD("newInstance failed: no <init>()\n");
514 dvmThrowExceptionWithClassMessage("Ljava/lang/InstantiationException;",
520 * Verify access from the call site.
522 * First, make sure the method invoking Class.newInstance() has permission
523 * to access the class.
525 * Second, make sure it has permission to invoke the constructor. The
526 * constructor must be public or, if the caller is in the same package,
527 * have package scope.
529 ClassObject* callerClass = dvmGetCaller2Class(self->curFrame);
531 if (!dvmCheckClassAccess(callerClass, clazz)) {
532 LOGD("newInstance failed: %s not accessible to %s\n",
533 clazz->descriptor, callerClass->descriptor);
534 dvmThrowException("Ljava/lang/IllegalAccessException;",
535 "access to class not allowed");
538 if (!dvmCheckMethodAccess(callerClass, init)) {
539 LOGD("newInstance failed: %s.<init>() not accessible to %s\n",
540 clazz->descriptor, callerClass->descriptor);
541 dvmThrowException("Ljava/lang/IllegalAccessException;",
542 "access to constructor not allowed");
546 newObj = dvmAllocObject(clazz, ALLOC_DEFAULT);
549 /* invoke constructor; unlike reflection calls, we don't wrap exceptions */
550 dvmCallMethod(self, init, newObj, &unused);
551 dvmReleaseTrackedAlloc(newObj, NULL);
557 * private Object[] getSignatureAnnotation()
559 * Returns the signature annotation array.
561 static void Dalvik_java_lang_Class_getSignatureAnnotation(const u4* args,
564 ClassObject* clazz = (ClassObject*) args[0];
565 ArrayObject* arr = dvmGetClassSignatureAnnotation(clazz);
567 dvmReleaseTrackedAlloc((Object*) arr, NULL);
572 * public Class getDeclaringClass()
574 * Get the class that encloses this class (if any).
576 static void Dalvik_java_lang_Class_getDeclaringClass(const u4* args,
579 ClassObject* clazz = (ClassObject*) args[0];
581 ClassObject* enclosing = dvmGetDeclaringClass(clazz);
582 dvmReleaseTrackedAlloc((Object*) enclosing, NULL);
583 RETURN_PTR(enclosing);
587 * public Class getEnclosingClass()
589 * Get the class that encloses this class (if any).
591 static void Dalvik_java_lang_Class_getEnclosingClass(const u4* args,
594 ClassObject* clazz = (ClassObject*) args[0];
596 ClassObject* enclosing = dvmGetEnclosingClass(clazz);
597 dvmReleaseTrackedAlloc((Object*) enclosing, NULL);
598 RETURN_PTR(enclosing);
602 * public Constructor getEnclosingConstructor()
604 * Get the constructor that encloses this class (if any).
606 static void Dalvik_java_lang_Class_getEnclosingConstructor(const u4* args,
609 ClassObject* clazz = (ClassObject*) args[0];
611 Object* enclosing = dvmGetEnclosingMethod(clazz);
612 if (enclosing != NULL) {
613 dvmReleaseTrackedAlloc(enclosing, NULL);
614 if (enclosing->clazz == gDvm.classJavaLangReflectConstructor) {
615 RETURN_PTR(enclosing);
617 assert(enclosing->clazz == gDvm.classJavaLangReflectMethod);
623 * public Method getEnclosingMethod()
625 * Get the method that encloses this class (if any).
627 static void Dalvik_java_lang_Class_getEnclosingMethod(const u4* args,
630 ClassObject* clazz = (ClassObject*) args[0];
632 Object* enclosing = dvmGetEnclosingMethod(clazz);
633 if (enclosing != NULL) {
634 dvmReleaseTrackedAlloc(enclosing, NULL);
635 if (enclosing->clazz == gDvm.classJavaLangReflectMethod) {
636 RETURN_PTR(enclosing);
638 assert(enclosing->clazz == gDvm.classJavaLangReflectConstructor);
644 static void Dalvik_java_lang_Class_getGenericInterfaces(const u4* args,
647 dvmThrowException("Ljava/lang/UnsupportedOperationException;",
648 "native method not implemented");
653 static void Dalvik_java_lang_Class_getGenericSuperclass(const u4* args,
656 dvmThrowException("Ljava/lang/UnsupportedOperationException;",
657 "native method not implemented");
662 static void Dalvik_java_lang_Class_getTypeParameters(const u4* args,
665 dvmThrowException("Ljava/lang/UnsupportedOperationException;",
666 "native method not implemented");
673 * public boolean isAnonymousClass()
675 * Returns true if this is an "anonymous" class.
677 static void Dalvik_java_lang_Class_isAnonymousClass(const u4* args,
680 ClassObject* clazz = (ClassObject*) args[0];
681 StringObject* className = NULL;
685 * If this has an InnerClass annotation, pull it out. Lack of the
686 * annotation, or an annotation with a NULL class name, indicates
687 * that this is an anonymous inner class.
689 if (!dvmGetInnerClass(clazz, &className, &accessFlags))
690 RETURN_BOOLEAN(false);
692 dvmReleaseTrackedAlloc((Object*) className, NULL);
693 RETURN_BOOLEAN(className == NULL);
697 * private Annotation[] getDeclaredAnnotations()
699 * Return the annotations declared on this class.
701 static void Dalvik_java_lang_Class_getDeclaredAnnotations(const u4* args,
704 ClassObject* clazz = (ClassObject*) args[0];
706 ArrayObject* annos = dvmGetClassAnnotations(clazz);
707 dvmReleaseTrackedAlloc((Object*) annos, NULL);
712 * public String getInnerClassName()
714 * Returns the simple name of a member class or local class, or null otherwise.
716 static void Dalvik_java_lang_Class_getInnerClassName(const u4* args,
719 ClassObject* clazz = (ClassObject*) args[0];
720 StringObject* nameObj;
723 if (dvmGetInnerClass(clazz, &nameObj, &flags)) {
724 dvmReleaseTrackedAlloc((Object*) nameObj, NULL);
732 * static native void setAccessibleNoCheck(AccessibleObject ao, boolean flag);
734 static void Dalvik_java_lang_Class_setAccessibleNoCheck(const u4* args,
737 Object* target = (Object*) args[0];
738 u4 flag = (u4) args[1];
740 dvmSetFieldBoolean(target, gDvm.offJavaLangReflectAccessibleObject_flag,
744 const DalvikNativeMethod dvm_java_lang_Class[] = {
745 { "desiredAssertionStatus", "()Z",
746 Dalvik_java_lang_Class_desiredAssertionStatus },
747 { "classForName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;",
748 Dalvik_java_lang_Class_classForName },
749 { "getClassLoader", "(Ljava/lang/Class;)Ljava/lang/ClassLoader;",
750 Dalvik_java_lang_Class_getClassLoader },
751 { "getComponentType", "()Ljava/lang/Class;",
752 Dalvik_java_lang_Class_getComponentType },
753 { "getSignatureAnnotation", "()[Ljava/lang/Object;",
754 Dalvik_java_lang_Class_getSignatureAnnotation },
755 { "getDeclaredClasses", "(Ljava/lang/Class;Z)[Ljava/lang/Class;",
756 Dalvik_java_lang_Class_getDeclaredClasses },
757 { "getDeclaredConstructors", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;",
758 Dalvik_java_lang_Class_getDeclaredConstructors },
759 { "getDeclaredFields", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;",
760 Dalvik_java_lang_Class_getDeclaredFields },
761 { "getDeclaredMethods", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;",
762 Dalvik_java_lang_Class_getDeclaredMethods },
763 { "getDeclaredConstructorOrMethod", "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Member;",
764 Dalvik_java_lang_Class_getDeclaredConstructorOrMethod },
765 { "getInterfaces", "()[Ljava/lang/Class;",
766 Dalvik_java_lang_Class_getInterfaces },
767 { "getModifiers", "(Ljava/lang/Class;Z)I",
768 Dalvik_java_lang_Class_getModifiers },
769 { "getNameNative", "()Ljava/lang/String;",
770 Dalvik_java_lang_Class_getNameNative },
771 { "getSuperclass", "()Ljava/lang/Class;",
772 Dalvik_java_lang_Class_getSuperclass },
773 { "isAssignableFrom", "(Ljava/lang/Class;)Z",
774 Dalvik_java_lang_Class_isAssignableFrom },
775 { "isInstance", "(Ljava/lang/Object;)Z",
776 Dalvik_java_lang_Class_isInstance },
777 { "isInterface", "()Z",
778 Dalvik_java_lang_Class_isInterface },
779 { "isPrimitive", "()Z",
780 Dalvik_java_lang_Class_isPrimitive },
781 { "newInstanceImpl", "()Ljava/lang/Object;",
782 Dalvik_java_lang_Class_newInstance },
783 { "getDeclaringClass", "()Ljava/lang/Class;",
784 Dalvik_java_lang_Class_getDeclaringClass },
785 { "getEnclosingClass", "()Ljava/lang/Class;",
786 Dalvik_java_lang_Class_getEnclosingClass },
787 { "getEnclosingConstructor", "()Ljava/lang/reflect/Constructor;",
788 Dalvik_java_lang_Class_getEnclosingConstructor },
789 { "getEnclosingMethod", "()Ljava/lang/reflect/Method;",
790 Dalvik_java_lang_Class_getEnclosingMethod },
792 { "getGenericInterfaces", "()[Ljava/lang/reflect/Type;",
793 Dalvik_java_lang_Class_getGenericInterfaces },
794 { "getGenericSuperclass", "()Ljava/lang/reflect/Type;",
795 Dalvik_java_lang_Class_getGenericSuperclass },
796 { "getTypeParameters", "()Ljava/lang/reflect/TypeVariable;",
797 Dalvik_java_lang_Class_getTypeParameters },
799 { "isAnonymousClass", "()Z",
800 Dalvik_java_lang_Class_isAnonymousClass },
801 { "getDeclaredAnnotations", "()[Ljava/lang/annotation/Annotation;",
802 Dalvik_java_lang_Class_getDeclaredAnnotations },
803 { "getInnerClassName", "()Ljava/lang/String;",
804 Dalvik_java_lang_Class_getInnerClassName },
805 { "setAccessibleNoCheck", "(Ljava/lang/reflect/AccessibleObject;Z)V",
806 Dalvik_java_lang_Class_setAccessibleNoCheck },
807 { NULL, NULL, NULL },