1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * java.lang.reflect.Constructor 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h" 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "native/InternalNativePriv.h" 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public int getConstructorModifiers(Class declaringClass, int slot) 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_getConstructorModifiers( 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[1]; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[2]; 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method* meth; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth = dvmSlotToMethod(declaringClass, slot); 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_INT(dvmFixMethodFlags(meth->accessFlags)); 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public int constructNative(Object[] args, Class declaringClass, 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Class[] parameterTypes, int slot, boolean noAccessCheck) 42d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * 43d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * We get here through Constructor.newInstance(). The Constructor object 44d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * would not be available if the constructor weren't public (per the 45d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * definition of Class.getConstructor), so we can skip the method access 46d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * check. We can also safely assume the constructor isn't associated 47d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden * with an interface, array, or primitive class. 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_constructNative( 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* argList = (ArrayObject*) args[1]; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[2]; 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* params = (ArrayObject*) args[3]; 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[4]; 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bool noAccessCheck = (args[5] != 0); 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object* newObj; 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method* meth; 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 61d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden if (dvmIsAbstractClass(declaringClass)) { 62d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden dvmThrowExceptionWithClassMessage("Ljava/lang/InstantiationException;", 63d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden declaringClass->descriptor); 64d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden RETURN_VOID(); 65d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden } 66d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden 67d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden /* initialize the class if it hasn't been already */ 68d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden if (!dvmIsClassInitialized(declaringClass)) { 69d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden if (!dvmInitClass(declaringClass)) { 70d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden LOGW("Class init failed in Constructor.constructNative (%s)\n", 71d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden declaringClass->descriptor); 72d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden assert(dvmCheckException(dvmThreadSelf())); 73d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden RETURN_VOID(); 74d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden } 75d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden } 76d3e57403913382d4173c3190b38ab1aae136c565Andy McFadden 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project newObj = dvmAllocObject(declaringClass, ALLOC_DEFAULT); 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (newObj == NULL) 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(NULL); 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth = dvmSlotToMethod(declaringClass, slot); 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(meth != NULL); 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (void) dvmInvokeMethod(newObj, meth, argList, params, NULL, noAccessCheck); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc(newObj, NULL); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(newObj); 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Annotation[] getDeclaredAnnotations(Class declaringClass, int slot) 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this constructor. 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_getDeclaredAnnotations( 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[1]; 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[2]; 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method* meth; 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth = dvmSlotToMethod(declaringClass, slot); 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(meth != NULL); 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* annos = dvmGetMethodAnnotations(meth); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*)annos, NULL); 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(annos); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * public Annotation[][] getParameterAnnotations(Class declaringClass, int slot) 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return the annotations declared for this constructor's parameters. 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_getParameterAnnotations( 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[1]; 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[2]; 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method* meth; 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth = dvmSlotToMethod(declaringClass, slot); 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(meth != NULL); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* annos = dvmGetParameterAnnotations(meth); 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*)annos, NULL); 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(annos); 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * private Object[] getSignatureAnnotation() 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Returns the signature annotation. 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectstatic void Dalvik_java_lang_reflect_Constructor_getSignatureAnnotation( 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project const u4* args, JValue* pResult) 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // ignore thisPtr in args[0] 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ClassObject* declaringClass = (ClassObject*) args[1]; 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int slot = args[2]; 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method* meth; 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project meth = dvmSlotToMethod(declaringClass, slot); 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project assert(meth != NULL); 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayObject* arr = dvmGetMethodSignatureAnnotation(meth); 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dvmReleaseTrackedAlloc((Object*) arr, NULL); 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RETURN_PTR(arr); 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DalvikNativeMethod dvm_java_lang_reflect_Constructor[] = { 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "constructNative", "([Ljava/lang/Object;Ljava/lang/Class;[Ljava/lang/Class;IZ)Ljava/lang/Object;", 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Constructor_constructNative }, 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getConstructorModifiers", "(Ljava/lang/Class;I)I", 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Constructor_getConstructorModifiers }, 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getDeclaredAnnotations", "(Ljava/lang/Class;I)[Ljava/lang/annotation/Annotation;", 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Constructor_getDeclaredAnnotations }, 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getParameterAnnotations", "(Ljava/lang/Class;I)[[Ljava/lang/annotation/Annotation;", 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Constructor_getParameterAnnotations }, 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { "getSignatureAnnotation", "(Ljava/lang/Class;I)[Ljava/lang/Object;", 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Dalvik_java_lang_reflect_Constructor_getSignatureAnnotation }, 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { NULL, NULL, NULL }, 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}; 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 166