| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * java.lang.reflect.Constructor |
| */ |
| #include "Dalvik.h" |
| #include "native/InternalNativePriv.h" |
| |
| |
| /* |
| * public int getConstructorModifiers(Class declaringClass, int slot) |
| */ |
| static void Dalvik_java_lang_reflect_Constructor_getConstructorModifiers( |
| const u4* args, JValue* pResult) |
| { |
| // ignore thisPtr in args[0] |
| ClassObject* declaringClass = (ClassObject*) args[1]; |
| int slot = args[2]; |
| Method* meth; |
| |
| meth = dvmSlotToMethod(declaringClass, slot); |
| RETURN_INT(dvmFixMethodFlags(meth->accessFlags)); |
| } |
| |
| /* |
| * public int constructNative(Object[] args, Class declaringClass, |
| * Class[] parameterTypes, int slot, boolean noAccessCheck) |
| * |
| * We get here through Constructor.newInstance(). The Constructor object |
| * would not be available if the constructor weren't public (per the |
| * definition of Class.getConstructor), so we can skip the method access |
| * check. We can also safely assume the constructor isn't associated |
| * with an interface, array, or primitive class. |
| */ |
| static void Dalvik_java_lang_reflect_Constructor_constructNative( |
| const u4* args, JValue* pResult) |
| { |
| // ignore thisPtr in args[0] |
| ArrayObject* argList = (ArrayObject*) args[1]; |
| ClassObject* declaringClass = (ClassObject*) args[2]; |
| ArrayObject* params = (ArrayObject*) args[3]; |
| int slot = args[4]; |
| bool noAccessCheck = (args[5] != 0); |
| Object* newObj; |
| Method* meth; |
| |
| if (dvmIsAbstractClass(declaringClass)) { |
| dvmThrowExceptionWithClassMessage("Ljava/lang/InstantiationException;", |
| declaringClass->descriptor); |
| RETURN_VOID(); |
| } |
| |
| /* initialize the class if it hasn't been already */ |
| if (!dvmIsClassInitialized(declaringClass)) { |
| if (!dvmInitClass(declaringClass)) { |
| LOGW("Class init failed in Constructor.constructNative (%s)\n", |
| declaringClass->descriptor); |
| assert(dvmCheckException(dvmThreadSelf())); |
| RETURN_VOID(); |
| } |
| } |
| |
| newObj = dvmAllocObject(declaringClass, ALLOC_DEFAULT); |
| if (newObj == NULL) |
| RETURN_PTR(NULL); |
| |
| meth = dvmSlotToMethod(declaringClass, slot); |
| assert(meth != NULL); |
| |
| (void) dvmInvokeMethod(newObj, meth, argList, params, NULL, noAccessCheck); |
| dvmReleaseTrackedAlloc(newObj, NULL); |
| RETURN_PTR(newObj); |
| } |
| |
| /* |
| * public Annotation[] getDeclaredAnnotations(Class declaringClass, int slot) |
| * |
| * Return the annotations declared for this constructor. |
| */ |
| static void Dalvik_java_lang_reflect_Constructor_getDeclaredAnnotations( |
| const u4* args, JValue* pResult) |
| { |
| // ignore thisPtr in args[0] |
| ClassObject* declaringClass = (ClassObject*) args[1]; |
| int slot = args[2]; |
| Method* meth; |
| |
| meth = dvmSlotToMethod(declaringClass, slot); |
| assert(meth != NULL); |
| |
| ArrayObject* annos = dvmGetMethodAnnotations(meth); |
| dvmReleaseTrackedAlloc((Object*)annos, NULL); |
| RETURN_PTR(annos); |
| } |
| |
| /* |
| * public Annotation[][] getParameterAnnotations(Class declaringClass, int slot) |
| * |
| * Return the annotations declared for this constructor's parameters. |
| */ |
| static void Dalvik_java_lang_reflect_Constructor_getParameterAnnotations( |
| const u4* args, JValue* pResult) |
| { |
| // ignore thisPtr in args[0] |
| ClassObject* declaringClass = (ClassObject*) args[1]; |
| int slot = args[2]; |
| Method* meth; |
| |
| meth = dvmSlotToMethod(declaringClass, slot); |
| assert(meth != NULL); |
| |
| ArrayObject* annos = dvmGetParameterAnnotations(meth); |
| dvmReleaseTrackedAlloc((Object*)annos, NULL); |
| RETURN_PTR(annos); |
| } |
| |
| /* |
| * private Object[] getSignatureAnnotation() |
| * |
| * Returns the signature annotation. |
| */ |
| static void Dalvik_java_lang_reflect_Constructor_getSignatureAnnotation( |
| const u4* args, JValue* pResult) |
| { |
| // ignore thisPtr in args[0] |
| ClassObject* declaringClass = (ClassObject*) args[1]; |
| int slot = args[2]; |
| Method* meth; |
| |
| meth = dvmSlotToMethod(declaringClass, slot); |
| assert(meth != NULL); |
| |
| ArrayObject* arr = dvmGetMethodSignatureAnnotation(meth); |
| dvmReleaseTrackedAlloc((Object*) arr, NULL); |
| RETURN_PTR(arr); |
| } |
| |
| const DalvikNativeMethod dvm_java_lang_reflect_Constructor[] = { |
| { "constructNative", "([Ljava/lang/Object;Ljava/lang/Class;[Ljava/lang/Class;IZ)Ljava/lang/Object;", |
| Dalvik_java_lang_reflect_Constructor_constructNative }, |
| { "getConstructorModifiers", "(Ljava/lang/Class;I)I", |
| Dalvik_java_lang_reflect_Constructor_getConstructorModifiers }, |
| { "getDeclaredAnnotations", "(Ljava/lang/Class;I)[Ljava/lang/annotation/Annotation;", |
| Dalvik_java_lang_reflect_Constructor_getDeclaredAnnotations }, |
| { "getParameterAnnotations", "(Ljava/lang/Class;I)[[Ljava/lang/annotation/Annotation;", |
| Dalvik_java_lang_reflect_Constructor_getParameterAnnotations }, |
| { "getSignatureAnnotation", "(Ljava/lang/Class;I)[Ljava/lang/Object;", |
| Dalvik_java_lang_reflect_Constructor_getSignatureAnnotation }, |
| { NULL, NULL, NULL }, |
| }; |
| |