@Override
	public final void create() {
        IClass[] interfaces = sc.getInterfaces();
        String[] interfaceStrings = new String[interfaces.length];
        for (int i = 0; i < interfaces.length; i++) {
        	interfaceStrings[i] = interfaces[i].getType().getInternalName();
        }
        
        if(LOG.isPrintEnabled()){
        	LOG.print("Starting create class : " + sc.getName());
        }
        
        // create class
        cw.visit(sc.getVersion(), sc.getModifiers(),
                sc.getName().replace('.', '/'), null,
                Type.getInternalName(sc.getSuperclass().getName()), interfaceStrings);

        //beforeCreate        
        this.beforeCreate();
        
        // create default constructor
		boolean existInit = false;
		for(MethodBuilder methodBuilder : methods) {
			if(ASConstants.INIT.equals(methodBuilder.getName())) {
				existInit = true;
				break;
			}
		}
		if (!existInit) {
			createDefaultConstructor();
		}
        
        // create field
        for (FieldBuilder ifc : fields) {
            ifc.create(this);
        }

        // create method
        for (MethodBuilder imc : methods) {
            imc.create(this);
        }
	}