String staticFieldName = getStaticFieldName(type); referencedClasses.put(staticFieldName, type);
protected void createInterfaceSyntheticStaticFields() { if (referencedClasses.isEmpty()) return; addInnerClass(interfaceClassLoadingClass); for (Iterator iter = referencedClasses.iterator(); iter.hasNext();) { ClassRef ref = (ClassRef) iter.next(); String staticFieldName = getStaticFieldName(ref.type); // generate a field node interfaceClassLoadingClass.addField(staticFieldName, ACC_STATIC + ACC_SYNTHETIC, ClassHelper.CLASS_Type, new ClassExpression(ref.type)); } }
/** * load class object on stack */ public void visitClassExpression(ClassExpression expression) { ClassNode type = expression.getType(); if (ClassHelper.isPrimitiveType(type)) { ClassNode objectType = ClassHelper.getWrapper(type); mv.visitFieldInsn(GETSTATIC, BytecodeHelper.getClassInternalName(objectType), "TYPE", "Ljava/lang/Class;"); } else { String staticFieldName = getStaticFieldName(type); referencedClasses.put(staticFieldName,type); String internalClassName = this.internalClassName; if (classNode.isInterface()) { internalClassName = BytecodeHelper.getClassInternalName(interfaceClassLoadingClass); mv.visitFieldInsn(GETSTATIC, internalClassName, staticFieldName, "Ljava/lang/Class;"); } else { mv.visitMethodInsn(INVOKESTATIC, internalClassName, "$get$" + staticFieldName, "()Ljava/lang/Class;"); } } }
protected void createSyntheticStaticFields() { for (Iterator iter = referencedClasses.iterator(); iter.hasNext();) { ClassRef ref = (ClassRef) iter.next(); String staticFieldName = getStaticFieldName(ref.type);
/** * load class object on stack */ public void visitClassExpression(ClassExpression expression) { ClassNode type = expression.getType(); if (ClassHelper.isPrimitiveType(type)) { ClassNode objectType = ClassHelper.getWrapper(type); mv.visitFieldInsn(GETSTATIC, BytecodeHelper.getClassInternalName(objectType), "TYPE", "Ljava/lang/Class;"); } else { String staticFieldName = getStaticFieldName(type); referencedClasses.add(new ClassRef(type)); String internalClassName = this.internalClassName; if (classNode.isInterface()) { internalClassName = BytecodeHelper.getClassInternalName(interfaceClassLoadingClass); mv.visitFieldInsn(GETSTATIC, internalClassName, staticFieldName, "Ljava/lang/Class;"); } else { mv.visitMethodInsn(INVOKESTATIC, internalClassName, "$get$" + staticFieldName, "()Ljava/lang/Class;"); } } }
/** * load class object on stack */ public void visitClassExpression(ClassExpression expression) { ClassNode type = expression.getType(); MethodVisitor mv = controller.getMethodVisitor(); if (ClassHelper.isPrimitiveType(type)) { ClassNode objectType = ClassHelper.getWrapper(type); mv.visitFieldInsn(GETSTATIC, BytecodeHelper.getClassInternalName(objectType), "TYPE", "Ljava/lang/Class;"); } else { String staticFieldName = getStaticFieldName(type); referencedClasses.put(staticFieldName,type); String internalClassName = controller.getInternalClassName(); if (controller.getClassNode().isInterface()) { internalClassName = BytecodeHelper.getClassInternalName(controller.getInterfaceClassLoadingClass()); mv.visitFieldInsn(GETSTATIC, internalClassName, staticFieldName, "Ljava/lang/Class;"); } else { mv.visitMethodInsn(INVOKESTATIC, internalClassName, "$get$" + staticFieldName, "()Ljava/lang/Class;"); } } controller.getOperandStack().push(ClassHelper.CLASS_Type); }
staticFieldName = getStaticFieldName(type); if (compileStack.getCurrentMetaClassIndex() != -1) { mv.visitVarInsn(ALOAD, compileStack.getCurrentMetaClassIndex()); staticFieldName = getStaticFieldName(type);