1 /* class: java/lang/Class */
11 #include "java_lang_Class.h"
12 #include "java_lang_reflect_Constructor.h"
13 #include "java_lang_reflect_Field.h"
14 #include "java_lang_reflect_Method.h"
15 #include "java_lang_Throwable.h" /* needed for java_lang_VMClass.h */
16 #include "java_lang_VMClass.h"
19 /* for selecting public members */
20 #define MEMBER_PUBLIC 0
24 * Class: java_lang_VMClass
26 * Signature: (Ljava/lang/String;)Ljava/lang/Class;
28 JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, struct java_lang_String* s)
34 log_text("Java_java_lang_VMClass_forName called");
35 log_text(javastring_tochar((java_objectheader*)s));
38 /* illegal argument */
41 /* create utf string in which '.' is replaced by '/' */
42 u = javastring_toutf(s, true);
46 /* class was not loaded. raise exception */
49 log_text("Setting class not found exception");
51 native_new_and_init_string(class_java_lang_ClassNotFoundException, s);
56 /*log_text("Returning class");*/
57 use_class_as_object (c);
58 return (java_lang_Class*) c;
62 * Class: java_lang_VMClass
63 * Method: getClassLoader
64 * Signature: ()Ljava/lang/ClassLoader;
66 JNIEXPORT struct java_lang_ClassLoader* JNICALL Java_java_lang_VMClass_getClassLoader (JNIEnv *env , struct java_lang_VMClass* this )
68 init_systemclassloader();
69 return SystemClassLoader;
73 * Class: java_lang_VMClass
74 * Method: getModifiers
77 JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType (JNIEnv *env , struct java_lang_VMClass* this )
79 classinfo *thisclass = (classinfo*) (this->vmData);
81 arraydescriptor *desc;
83 if ((desc = thisclass->vftbl->arraydesc) != NULL) {
84 if (desc->arraytype == ARRAYTYPE_OBJECT)
85 c = desc->componentvftbl->class;
87 c = primitivetype_table[desc->arraytype].class_primitive;
90 use_class_as_object (c);
93 return (java_lang_Class*) c;
98 * Class: java_lang_VMClass
99 * Method: getDeclaredConstructors
100 * Signature: (Z)[Ljava/lang/reflect/Constructor;
102 JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredConstructors (JNIEnv *env , struct java_lang_VMClass* this , s4 public_only)
105 classinfo *c = (classinfo *) (this->vmData);
106 java_objectheader *o;
107 classinfo *class_constructor;
108 java_objectarray *array_constructor; /* result: array of Method-objects */
109 java_objectarray *exceptiontypes; /* the exceptions thrown by the method */
110 methodinfo *m; /* the current method to be represented */
111 int public_methods = 0; /* number of public methods of the class */
114 utf *utf_constr=utf_new_char("<init>");
118 log_text("Java_java_lang_VMClass_getDeclaredConstructors");
119 utf_display(c->name);
121 /* class_showmethods(c);
122 class_showmethods(loader_load(utf_new_char("java/lang/Class")));*/
125 /* determine number of constructors */
126 for (i = 0; i < c->methodscount; i++)
127 if ((((c->methods[i].flags & ACC_PUBLIC)) || (!public_only)) &&
128 (c->methods[i].name==utf_constr)) public_methods++;
130 class_constructor = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Constructor"));
131 if (!class_constructor)
134 array_constructor = builtin_anewarray(public_methods, class_constructor);
136 if (!array_constructor)
139 for (i = 0; i < c->methodscount; i++)
140 if ((c->methods[i].flags & ACC_PUBLIC) || (!public_only)){
143 if (m->name!=utf_constr) continue;
144 o = native_new_and_init(class_constructor);
145 array_constructor->data[pos++] = o;
147 /* array of exceptions declared to be thrown, information not available !! */
148 exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
150 /* class_showconstantpool(class_constructor);*/
151 /* initialize instance fields */
152 /* ((java_lang_reflect_Constructor*)o)->flag=(m->flags & (ACC_PRIVATE | ACC_PUBLIC | ACC_PROTECTED));*/
153 setfield_critical(class_constructor,o,"clazz", "Ljava/lang/Class;", jobject, (jobject) c /*this*/);
154 setfield_critical(class_constructor,o,"slot", "I", jint, i);
155 /* setfield_critical(class_constructor,o,"flag", "I", jint, (m->flags & (ACC_PRIVATE |
156 ACC_PUBLIC | ACC_PROTECTED))); */
157 setfield_critical(class_constructor,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
158 setfield_critical(class_constructor,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) get_parametertypes(m));
161 log_text("leaving Java_java_lang_VMClass_getDeclaredConstructors");
162 return array_constructor;
167 /* panic("Java_java_lang_Class_getConstructors0 called");
173 * Class: java_lang_VMClass
174 * Method: getDeclaredClasses
175 * Signature: (Z)[Ljava/lang/Class;
177 JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredClasses (JNIEnv *env , struct java_lang_VMClass* this , s4 publicOnly)
179 #warning fix the public only case
180 classinfo *c = (classinfo *) (this->vmData);
181 int pos = 0; /* current declared class */
182 int declaredclasscount = 0; /* number of declared classes */
183 java_objectarray *result; /* array of declared classes */
192 if (!Java_java_lang_VMClass_isPrimitive(env, this) && (c->name->text[0]!='[')) {
193 /* determine number of declared classes */
194 for (i = 0; i < c->innerclasscount; i++) {
195 if (c->innerclass[i].outer_class == c)
196 /* outer class is this class */
197 declaredclasscount++;
201 result = builtin_anewarray(declaredclasscount, class_java_lang_Class);
203 for (i = 0; i < c->innerclasscount; i++) {
205 classinfo *inner = c->innerclass[i].inner_class;
206 classinfo *outer = c->innerclass[i].outer_class;
209 /* outer class is this class, store innerclass in array */
210 use_class_as_object (inner);
211 result->data[pos++] = (java_objectheader *) inner;
219 * Class: java/lang/Class
220 * Method: getDeclaringClass
221 * Signature: ()Ljava/lang/Class;
223 JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getDeclaringClass ( JNIEnv *env , struct java_lang_VMClass* this)
226 classinfo *c = (classinfo *) (this->vmData);
227 log_text("Java_java_lang_VMClass_getDeclaringClass");
229 if (this && this->vmData && !Java_java_lang_VMClass_isPrimitive(env, this) && (c->name->text[0]!='[')) {
232 if (c->innerclasscount == 0) /* no innerclasses exist */
235 for (i = 0; i < c->innerclasscount; i++) {
237 classinfo *inner = c->innerclass[i].inner_class;
238 classinfo *outer = c->innerclass[i].outer_class;
241 /* innerclass is this class */
242 use_class_as_object (outer);
243 return (java_lang_Class*) outer;
248 /* return NULL for arrayclasses and primitive classes */
253 * Class: java/lang/Class
255 * Signature: (Ljava/lang/String;I)Ljava/lang/reflect/Field;
257 JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_java_lang_VMClass_getField0 ( JNIEnv *env , struct java_lang_VMClass* this, struct java_lang_String* name, s4 public_only)
259 classinfo *c, *fieldtype;
260 fieldinfo *f; /* the field to be represented */
261 java_lang_reflect_Field *o; /* result: field-object */
262 utf *desc; /* the fielddescriptor */
265 /* create Field object */
266 c = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Field"));
267 o = (java_lang_reflect_Field*) native_new_and_init(c);
269 /* get fieldinfo entry */
270 idx = class_findfield_index_approx((classinfo*) (this->vmData), javastring_toutf(name, false));
272 exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
275 f= &(((struct classinfo*)(this->vmData))->fields[idx]);
278 if ( public_only && !(f->flags & ACC_PUBLIC))
280 /* field is not public and public only had been requested*/
281 exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldException);
285 desc = f->descriptor;
286 fieldtype = class_from_descriptor(desc->text,utf_end(desc),NULL,true);
287 if (!fieldtype) return NULL;
289 /* initialize instance fields */
290 setfield_critical(c,o,"declaringClass", "Ljava/lang/Class;", jobject, (jobject) (this->vmData) /*this*/);
291 /* ((java_lang_reflect_Field*)(o))->flag=f->flags;*/
292 /* save type in slot-field for faster processing */
293 /* setfield_critical(c,o,"flag", "I", jint, (jint) f->flags); */
294 setfield_critical(c,o,"slot", "I", jint, (jint) idx);
295 setfield_critical(c,o,"name", "Ljava/lang/String;", jstring, (jstring) name);
296 /*setfield_critical(c,o,"type", "Ljava/lang/Class;", jclass, fieldtype);*/
306 * Class: java_lang_VMClass
307 * Method: getDeclaredFields
308 * Signature: (Z)[Ljava/lang/reflect/Field;
310 JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredFields (JNIEnv *env , struct java_lang_VMClass* this , s4 public_only)
312 classinfo *c = (classinfo *) (this->vmData);
313 classinfo *class_field;
314 java_objectarray *array_field; /* result: array of field-objects */
315 int public_fields = 0; /* number of elements in field-array */
319 /* determine number of fields */
320 for (i = 0; i < c->fieldscount; i++)
321 if ((c->fields[i].flags & ACC_PUBLIC) || (!public_only)) public_fields++;
323 class_field = loader_load(utf_new_char("java/lang/reflect/Field"));
328 /* create array of fields */
329 array_field = builtin_anewarray(public_fields, class_field);
331 /* creation of array failed */
335 /* get the fields and store in the array */
336 for (i = 0; i < c->fieldscount; i++)
337 if ( (c->fields[i].flags & ACC_PUBLIC) || (!public_only))
338 array_field->data[pos++] = (java_objectheader*) Java_java_lang_VMClass_getField0
341 (java_lang_String*) javastring_new(c->fields[i].name),
347 * Class: java/lang/Class
348 * Method: getInterfaces
349 * Signature: ()[Ljava/lang/Class;
351 JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getInterfaces ( JNIEnv *env , struct java_lang_VMClass* this)
353 classinfo *c = (classinfo*) (this->vmData);
355 java_objectarray *a = builtin_anewarray (c->interfacescount, class_java_lang_Class);
357 for (i=0; i<c->interfacescount; i++) {
358 use_class_as_object (c->interfaces[i]);
360 a->data[i] = (java_objectheader*) c->interfaces[i];
367 * Class: java/lang/Class
369 * Signature: (Ljava/lang/String;[Ljava/lang/Class;I)Ljava/lang/reflect/Method;
371 JNIEXPORT struct java_lang_reflect_Method* JNICALL Java_java_lang_VMClass_getMethod0 ( JNIEnv *env , struct java_lang_Class*
372 this, struct java_lang_String* name, java_objectarray* types, s4 which)
375 classinfo *clazz = (classinfo *) this;
376 java_lang_reflect_Method* o; /* result: Method-object */
377 java_objectarray *exceptiontypes; /* the exceptions thrown by the method */
378 methodinfo *m; /* the method to be represented */
380 c = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
381 o = (java_lang_reflect_Method*) native_new_and_init(c);
383 /* find the method */
384 m = class_resolvemethod_approx (
386 javastring_toutf(name, false),
387 create_methodsig(types,0)
390 if (!m || (which==MEMBER_PUBLIC && !(m->flags & ACC_PUBLIC)))
392 /* no apropriate method was found */
393 exceptionptr = native_new_and_init (class_java_lang_NoSuchMethodException);
397 /* array of exceptions declared to be thrown, information not available !! */
398 exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
400 /* initialize instance fields */
401 setfield_critical(c,o,"clazz", "Ljava/lang/Class;", jobject, (jobject) clazz /*this*/);
402 setfield_critical(c,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) types);
403 setfield_critical(c,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
404 setfield_critical(c,o,"name", "Ljava/lang/String;", jstring, javastring_new(m->name));
405 setfield_critical(c,o,"modifiers", "I", jint, m->flags);
406 setfield_critical(c,o,"slot", "I", jint, 0);
407 setfield_critical(c,o,"returnType", "Ljava/lang/Class;", jclass, get_returntype(m));
413 * Class: java_lang_VMClass
414 * Method: getDeclaredMethods
415 * Signature: (Z)[Ljava/lang/reflect/Method;
417 JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getDeclaredMethods (JNIEnv *env , struct java_lang_VMClass* this , s4 public_only)
419 classinfo *c = (classinfo *) this->vmData;
420 java_objectheader *o;
421 classinfo *class_method;
422 java_objectarray *array_method; /* result: array of Method-objects */
423 java_objectarray *exceptiontypes; /* the exceptions thrown by the method */
424 methodinfo *m; /* the current method to be represented */
425 int public_methods = 0; /* number of public methods of the class */
429 /* determine number of methods */
430 for (i = 0; i < c->methodscount; i++)
431 if (((c->methods[i].flags & ACC_PUBLIC)) || (!public_only)) public_methods++;
433 class_method = (classinfo*) loader_load(utf_new_char ("java/lang/reflect/Method"));
435 class_showmethods(class_method);
442 array_method = builtin_anewarray(public_methods, class_method);
447 for (i = 0; i < c->methodscount; i++)
448 if ((c->methods[i].flags & ACC_PUBLIC) || (!public_only)){
451 o = native_new_and_init(class_method);
452 array_method->data[pos++] = o;
454 /* array of exceptions declared to be thrown, information not available !! */
455 exceptiontypes = builtin_anewarray (0, class_java_lang_Class);
458 /* initialize instance fields */
459 /* ((java_lang_reflect_Method*)o)->flag=(m->flags &
460 (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_ABSTRACT | ACC_STATIC | ACC_FINAL |
461 ACC_SYNCHRONIZED | ACC_NATIVE | ACC_STRICT)
463 setfield_critical(class_method,o,"declaringClass", "Ljava/lang/Class;", jobject, (jobject) c /*this*/);
464 setfield_critical(class_method,o,"name", "Ljava/lang/String;", jstring, javastring_new(m->name));
465 /* setfield_critical(class_method,o,"flag", "I", jint, (m->flags &
466 (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_ABSTRACT | ACC_STATIC | ACC_FINAL |
467 ACC_SYNCHRONIZED | ACC_NATIVE | ACC_STRICT)));*/
468 setfield_critical(class_method,o,"slot", "I", jint, i);
469 /* setfield_critical(class_method,o,"returnType", "Ljava/lang/Class;", jclass, get_returntype(m));
470 setfield_critical(class_method,o,"exceptionTypes", "[Ljava/lang/Class;", jobject, (jobject) exceptiontypes);
471 setfield_critical(class_method,o,"parameterTypes", "[Ljava/lang/Class;", jobject, (jobject) get_parametertypes(m));*/
478 * Class: java/lang/Class
479 * Method: getModifiers
482 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_getModifiers ( JNIEnv *env , struct java_lang_VMClass* this)
484 classinfo *c = (classinfo *) (this->vmData);
489 * Class: java/lang/Class
491 * Signature: ()Ljava/lang/String;
493 JNIEXPORT struct java_lang_String* JNICALL Java_java_lang_VMClass_getName ( JNIEnv *env , struct java_lang_VMClass* this)
496 classinfo *c = (classinfo*) (this->vmData);
498 char *utf__ptr = c->name->text; /* current position in utf-text */
499 char **utf_ptr = &utf__ptr;
500 char *desc_end = utf_end(c->name); /* points behind utf string */
505 if (runverbose) log_text("Java_java_lang_VMClass_getName");
508 while ( *utf_ptr != desc_end ) {
509 if (utf_nextu2(utf_ptr)=='[') dimCnt++;
512 utf__ptr=(*utf_ptr)-1;
515 if (((*utf_ptr)+1)==desc_end) {
516 for (i=0;i<PRIMITIVETYPE_COUNT;i++) {
517 if (primitivetype_table[i].typesig==(*utf__ptr)) {
518 len=dimCnt*2+strlen(primitivetype_table[i].name);
519 str=MNEW(char,len+1);
520 strcpy(str,primitivetype_table[i].name);
526 len=dimCnt+strlen(c->name->text);
527 str=MNEW(char,len+1);
528 strcpy(str,utf__ptr);
533 for (i=len-1;i>=dimCnt;i=i-2) {
537 s=(java_lang_String*)javastring_new(utf_new_char(str));
538 MFREE(str,char,len+1);
542 /* return string where '/' is replaced by '.' */
543 for (i=0; i<s->value->header.size; i++) {
544 if (s->value->data[i] == '/') s->value->data[i] = '.';
553 * Class: java/lang/Class
554 * Method: getProtectionDomain0
555 * Signature: ()Ljava/security/ProtectionDomain;
557 JNIEXPORT struct java_security_ProtectionDomain* JNICALL Java_java_lang_VMClass_getProtectionDomain0 ( JNIEnv *env , struct java_lang_Class* this)
559 log_text("Java_java_lang_VMClass_getProtectionDomain0 called");
564 * Class: java/lang/Class
566 * Signature: ()[Ljava/lang/Object;
568 JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMClass_getSigners ( JNIEnv *env , struct java_lang_Class* this)
570 log_text("Java_java_lang_VMClass_getSigners called");
575 * Class: java/lang/Class
576 * Method: getSuperclass
577 * Signature: ()Ljava/lang/Class;
579 JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_getSuperclass ( JNIEnv *env , struct java_lang_VMClass* this)
581 classinfo *c = ((classinfo*) this->vmData) -> super;
584 use_class_as_object (c);
585 return (java_lang_Class*) c;
589 * Class: java/lang/Class
593 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isArray ( JNIEnv *env , struct java_lang_VMClass* this)
595 classinfo *c = (classinfo*) (this->vmData);
596 return c->vftbl->arraydesc != NULL;
600 * Class: java/lang/Class
601 * Method: isAssignableFrom
602 * Signature: (Ljava/lang/Class;)Z
604 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAssignableFrom ( JNIEnv *env , struct java_lang_VMClass* this, struct java_lang_Class* sup)
607 log_text("Java_java_lang_VMClass_isAssignableFrom");
611 panic("sup->vmClass is NULL in VMClass.isAssignableFrom");
614 return (*env)->IsAssignableForm(env, (jclass) (this->vmData), (jclass) sup/*->vmClass*/);
618 * Class: java/lang/Class
620 * Signature: (Ljava/lang/Object;)Z
622 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInstance ( JNIEnv *env , struct java_lang_VMClass* this, struct java_lang_Object* obj)
624 classinfo *clazz = (classinfo*) this;
625 return (*env)->IsInstanceOf(env,(jobject) obj,clazz);
629 * Class: java/lang/Class
630 * Method: isInterface
633 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInterface ( JNIEnv *env , struct java_lang_VMClass* this)
635 classinfo *c = (classinfo*) this->vmData;
636 if (c->flags & ACC_INTERFACE) return true;
641 * Class: java/lang/Class
642 * Method: isPrimitive
645 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isPrimitive ( JNIEnv *env , struct java_lang_VMClass* this)
648 classinfo *c = (classinfo *) this->vmData;
650 /* search table of primitive classes */
651 for (i=0;i<PRIMITIVETYPE_COUNT;i++)
652 if (primitivetype_table[i].class_primitive == c) return true;
659 * Class: java/lang/Class
660 * Method: registerNatives
663 JNIEXPORT void JNICALL Java_java_lang_VMClass_registerNatives ( JNIEnv *env )
669 * Class: java/lang/Class
670 * Method: setProtectionDomain0
671 * Signature: (Ljava/security/ProtectionDomain;)V
673 JNIEXPORT void JNICALL Java_java_lang_VMClass_setProtectionDomain0 ( JNIEnv *env , struct java_lang_Class* this, struct java_security_ProtectionDomain* par1)
676 log_text("Java_java_lang_VMClass_setProtectionDomain0 called");
680 * Class: java/lang/Class
682 * Signature: ([Ljava/lang/Object;)V
684 JNIEXPORT void JNICALL Java_java_lang_VMClass_setSigners ( JNIEnv *env , struct java_lang_Class* this, java_objectarray* par1)
687 log_text("Java_java_lang_VMClass_setSigners called");
696 * Class: java_lang_VMClass
700 JNIEXPORT void JNICALL Java_java_lang_VMClass_initialize (JNIEnv *env , struct java_lang_VMClass* this ){
701 log_text("Java_java_lang_VMClass_initialize");
704 * Class: java_lang_VMClass
705 * Method: loadArrayClass
706 * Signature: (Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;
708 JNIEXPORT struct java_lang_Class* JNICALL Java_java_lang_VMClass_loadArrayClass (JNIEnv *env , jclass clazz, struct java_lang_String* par1, struct
709 java_lang_ClassLoader* par2) {
710 log_text("Java_java_lang_VMClass_loadArrayClass");
714 * Class: java_lang_VMClass
715 * Method: throwException
716 * Signature: (Ljava/lang/Throwable;)V
718 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException (JNIEnv *env , jclass clazz, struct java_lang_Throwable* par1) {
719 log_text("Java_java_lang_VMClass_throwException");
723 * Class: java_lang_VMClass
727 JNIEXPORT void JNICALL Java_java_lang_VMClass_step7 (JNIEnv *env , struct java_lang_VMClass* this ) {
728 log_text("Java_java_lang_VMClass_step7");
731 * Class: java_lang_VMClass
735 JNIEXPORT void JNICALL Java_java_lang_VMClass_step8 (JNIEnv *env , struct java_lang_VMClass* this ) {
736 log_text("Java_java_lang_VMClass_step8");
742 * Class: java_lang_VMClass
743 * Method: isInitialized
746 JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isInitialized (JNIEnv *env , struct java_lang_VMClass* this ) {
747 log_text("Java_java_lang_VMClass_isInitialized");
751 * Class: java_lang_VMClass
752 * Method: setInitialized
755 JNIEXPORT void JNICALL Java_java_lang_VMClass_setInitialized (JNIEnv *env , struct java_lang_VMClass* this ) {
756 log_text("Java_java_lang_VMClass_setInitialized");