func (self *ANEW_ARRAY) Execute(frame *rtda.Frame) { cp := frame.ConstantPool() kClass := cp.GetConstant(self.Index).(*rtc.ConstantClass) componentClass := kClass.Class() if componentClass.InitializationNotStarted() { thread := frame.Thread() frame.SetNextPC(thread.PC()) // undo anewarray thread.InitClass(componentClass) return } stack := frame.OperandStack() count := stack.PopInt() if count < 0 { frame.Thread().ThrowNegativeArraySizeException() } else { arr := rtc.NewRefArray(componentClass, uint(count)) stack.PushRef(arr) } }
// private native Field[] getDeclaredFields0(boolean publicOnly); // (Z)[Ljava/lang/reflect/Field; func getDeclaredFields0(frame *rtda.Frame) { vars := frame.LocalVars() classObj := vars.GetThis() publicOnly := vars.GetBoolean(1) class := classObj.Extra().(*rtc.Class) fields := class.GetFields(publicOnly) fieldCount := uint(len(fields)) fieldClass := rtc.BootLoader().LoadClass("java/lang/reflect/Field") fieldArr := rtc.NewRefArray(fieldClass, fieldCount) stack := frame.OperandStack() stack.PushRef(fieldArr) if fieldCount > 0 { thread := frame.Thread() fieldObjs := fieldArr.Refs() fieldConstructor := fieldClass.GetConstructor(_fieldConstructorDescriptor) for i, goField := range fields { fieldObj := fieldClass.NewObjWithExtra(goField) fieldObjs[i] = fieldObj // init fieldObj thread.InvokeMethodWithShim(fieldConstructor, []interface{}{ fieldObj, // this classObj, // declaringClass rtda.JString(goField.Name()), // name goField.Type().JClass(), // type int32(goField.GetAccessFlags()), // modifiers int32(goField.SlotId()), // slot getSignatureStr(goField.Signature()), // signature getAnnotationByteArr(goField.AnnotationData()), // annotations }) } } }